主题:[求助]Beginning DirectX的第一个示例WIN32代码出现编译错误问题
我把源代码贴在下面,后面注释的为问题所在及我通过某些途径的修改(可通过编译,但运行无任何显示,不出现窗口)。
#include <windows.h>
HINSTANCE hIns;
HWND wndHandle;
bool initWindow(HINSTANCE);
LRESULT CALLBACK WndProc( HWND , UINT, WPARAM, LPARAM );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPreIns, LPTSTR lpCmdLine, int nCmdShow)//参数中LPTSTR改为PSTR才能编译通过
{
if(!initWindow(hInstance))
return false;
MSG msg;
ZeroMemory(&msg, sizeof(msg)); //这条语句是干什么用的?
while(msg.message != WM_QUIT)
{
while(GetMessage(&msg, wndHandle, 0 , 0))//随书源码中wndHandle为NULL,而教程上则wndHandle,这有什么区别么?
{
TranslateMessage(&msg );
DispatchMessage( &msg );
}
}
return (int)msg.wParam;
}
bool initWindow(HINSTANCE hInstance)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = LoadCursor( NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Directx Example"; //必须加入(_T)强制转化该字符串
才能编译通过(我也不知道这样强制转化是不是会产生其他问题)
wc.hIconSm = 0;
RegisterClassEx(&wc);
hIns = hInstance;
wndHandle = CreateWindow(
"DirectX Example", //同上
"DirectX Example", //同上
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
if(!wndHandle)
return false;
ShowWindow(wndHandle, SW_SHOW);
UpdateWindow(wndHandle);
return true;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
在我自己的初步修改下,程序能正常编译通过,但运行时无任何反应,没有出现窗口。我不知道哪里出现错误,刚开始学习winAPI,很多地方不了解,望大鸟指教,不胜感激。(同时,感谢每位看完代码的读者,辛苦您的眼睛了, :-) )
经过几个小时的“奋战”,发现在作出上述修改后过不了RegisterClassEx,为什么会这样?无论我怎么修改注册类名称。
#include <windows.h>
HINSTANCE hIns;
HWND wndHandle;
bool initWindow(HINSTANCE);
LRESULT CALLBACK WndProc( HWND , UINT, WPARAM, LPARAM );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPreIns, LPTSTR lpCmdLine, int nCmdShow)//参数中LPTSTR改为PSTR才能编译通过
{
if(!initWindow(hInstance))
return false;
MSG msg;
ZeroMemory(&msg, sizeof(msg)); //这条语句是干什么用的?
while(msg.message != WM_QUIT)
{
while(GetMessage(&msg, wndHandle, 0 , 0))//随书源码中wndHandle为NULL,而教程上则wndHandle,这有什么区别么?
{
TranslateMessage(&msg );
DispatchMessage( &msg );
}
}
return (int)msg.wParam;
}
bool initWindow(HINSTANCE hInstance)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = LoadCursor( NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Directx Example"; //必须加入(_T)强制转化该字符串
才能编译通过(我也不知道这样强制转化是不是会产生其他问题)
wc.hIconSm = 0;
RegisterClassEx(&wc);
hIns = hInstance;
wndHandle = CreateWindow(
"DirectX Example", //同上
"DirectX Example", //同上
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
if(!wndHandle)
return false;
ShowWindow(wndHandle, SW_SHOW);
UpdateWindow(wndHandle);
return true;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
在我自己的初步修改下,程序能正常编译通过,但运行时无任何反应,没有出现窗口。我不知道哪里出现错误,刚开始学习winAPI,很多地方不了解,望大鸟指教,不胜感激。(同时,感谢每位看完代码的读者,辛苦您的眼睛了, :-) )
经过几个小时的“奋战”,发现在作出上述修改后过不了RegisterClassEx,为什么会这样?无论我怎么修改注册类名称。