我正在使用win32 api开发一个应用程序,但我遇到了问题。我编写代码来创建一个简单的窗口,然后创建附加到此窗口的简单按钮,最后创建简单的菜单资源并将其设置到窗口:
#include<Windows.h>
#include"resource.h"
#define DEFAULT_BUTTON_WIDTH 100
#define DEFAULT_BUTTON_HEIGHT 20
HMENU Menu;
HWND Window;
HWND bCreateWall;
void WMCommand(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (lParam == (LPARAM)bCreateWall) MessageBox (Window, (LPCWSTR)"You Pressed bCreateWall", (LPCWSTR)"Congrats!", MB_OK);
else if (wParam == ID_FILE_EXIT) PostQuitMessage(0);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_DESTROY:PostQuitMessage(0);break;
case WM_COMMAND: WMCommand (hWnd, msg, wParam, lParam); break;
}
return (DefWindowProc(hWnd,msg,wParam,lParam));
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpCmdString,int CmdShow)
{
WNDCLASS wc;
MSG msg;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = (LPCWSTR)"ME";
wc.lpszMenuName = NULL;
wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
if (!RegisterClass(&wc))
{
MessageBox (NULL,(LPCWSTR)"Error: Cannot Register Class", (LPCWSTR)"ERROR!", MB_OK);
return (0);
}
//create window
Window = CreateWindow((LPCWSTR)"ME",(LPCWSTR) "Map Editor", WS_OVERLAPPEDWINDOW | WS_VISIBLE,0, 0, 640, 480, NULL, NULL, hInstance, NULL);
if (Window == NULL)
{
MessageBox (NULL,(LPCWSTR)"Error: Failed to Create Window", (LPCWSTR)"ERROR!", MB_OK);
return (0);
}
//create button to create wall
bCreateWall = CreateWindow((LPCWSTR)"BUTTON", (LPCWSTR)"Create Wall", WS_CHILD | WS_VISIBLE, 0, 100, DEFAULT_BUTTON_WIDTH, DEFAULT_BUTTON_HEIGHT, Window,NULL, hInstance, NULL);
if (bCreateWall== NULL)
{
MessageBox (NULL, (LPCWSTR)"Error: Failed to Create Window",(LPCWSTR) "ERROR!", MB_OK);
return (0);
}
Menu = LoadMenu (hInstance, MAKEINTRESOURCE(IDR_MENU));
SetMenu (Window, Menu);
while (1)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage (&msg);
}
}
return 1;
}
运行时,窗口为空白,菜单和按钮不会添加。
方法createWindow返回null
我做错了什么?
答案 0 :(得分:0)
首先,我建议您决定代码格式。在我看来,您已经使用了来自不同来源的代码片段。 如果我是你,我会坚持使用默认的VS格式。像这样的一个衬垫:
if (lParam == (LPARAM)bCreateWall) MessageBox (Window, L"You Pressed bCreateWall", L"Congrats!", MB_OK);
else if (wParam == ID_FILE_EXIT) PostQuitMessage(0);
使代码非常难以阅读。为什么不为每个代码段使用单行代码块:
if(lParam == (LPARAM)bCreateWall)
{
MessageBox (Window, L"You Pressed bCreateWall", L"Congrats!", MB_OK);
}
else if(wParam == ID_FILE_EXIT)
{
PostQuitMessage(0);
}
此外,大括号是混合的,这无助于分析代码。分隔符之间的间距也不一致。格式一致不要马虎;这是优秀编程实践的一部分。
当您运行应用程序时,您可以看到一个消息框,说明了一些内容,但您只看到了垃圾字符。
您的问题是您正在编译项目集以使用UNICODE字符,但所有字符串都是ANSI。您只是将ANSI字符串转换为LPWSTR,这不足以转换字符串。 您的代码无法创建按钮,因为您最终使用(LPWSTR)“BUTTON”的名称为“啂呔乏”的类不存在。
使用_T(“string”),TEXT(“string”)将所有字符串转换为通用格式,或仅使用UNICODE字符串。 将所有(LPCWSTR)替换为L处理的引用字符串:L“string”并再试一次。