程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 應用-CreateWindow()調用失敗返回空句柄,而GetLastError卻返回0!

應用-CreateWindow()調用失敗返回空句柄,而GetLastError卻返回0!

編輯:編程解疑
CreateWindow()調用失敗返回空句柄,而GetLastError卻返回0!

下面一段代碼我是按照某本書上抄的,
#include

/////////////////////////////窗口過程聲明///////////////////////////////////
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

/////////////////////////////填充窗口類的函數聲明///////////////////////////
void fill_windows(WNDCLASSEX*,HINSTANCE,TCHAR*);

/////////////////////////////全局字符串////////////////////////////////////
TCHAR szAppName[]= TEXT("windows");

/////////////////////////////打印錯誤文本/////////////////////////////////
void geterrortext();

/////////////////////////////窗口主函數////////////////////////////////////
int WINAPI WinMain(_In_ HINSTANCE hInstance, In_opt HINSTANCE hPrevInstance, In PSTR szCmdLine, In int iCmdShow)
{

HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;

fill_windows(&wndclass,hInstance,szAppName); ///////////////////調用fill_windows填充窗口類字段

if (!RegisterClassEx(&wndclass)) ///////////////////注冊窗口類
{
MessageBox(NULL, TEXT("error"), szAppName, MB_ICONERROR);
return 0;
}
hWnd = CreateWindow(szAppName, ///////////////////窗口類名
szAppName, ///////////////////窗口標題
WS_OVERLAPPEDWINDOW, ///////////////////窗口風格
CW_USEDEFAULT, //////////////////窗口初始水平位置
0, //////////////////窗口初始垂直位置
CW_USEDEFAULT, //////////////////窗口寬度
0, ///////////////////窗口高度
NULL, //////////////////父窗口句柄
NULL, //////////////////菜單句柄
hInstance, //////////////////實例句柄
NULL); //////////////////指針
if (hWnd)
ShowWindow(hWnd, SW_SHOW);
else
{

geterrortext();
UnregisterClass(szAppName, hInstance);
return 0;
} ////////////////////////顯示窗口
UpdateWindow(hWnd); ////////////////////////傳遞給窗口WM_PAINT消息

while (GetMessage(&msg, NULL, 0, 0)) ///////////////////////消息循環
{
TranslateMessage(&msg); //////////////////////將擊鍵消息轉換為字符消息
DispatchMessage(&msg); //////////////////////發送消息給相應的窗口過程
}
return msg.wParam;

}

/////////////////////////////填充函數定義///////////////////////////////////
void fill_windows(WNDCLASSEX*pwin,HINSTANCE hInst,TCHAR*windowname)
{
pwin->cbSize = sizeof(WNDCLASSEX);
pwin->style = CS_HREDRAW | CS_VREDRAW; //////////////////窗口的類型
pwin->lpfnWndProc = WndProc; //////////////////窗口的窗口過程
pwin->cbClsExtra = 0; //////////////////窗口擴展
pwin->cbWndExtra = 0; //////////////////窗口實例擴展
pwin->hInstance = hInst; //////////////////窗口的實例句柄
pwin->hIcon = LoadIcon(NULL, IDI_APPLICATION); //////////////////窗口圖標
pwin->hCursor = LoadCursor(NULL, IDC_ARROW); //////////////////窗口指針
pwin->hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //////////////////窗口背景畫刷
pwin->lpszMenuName = NULL; //////////////////窗口菜單
pwin->lpszClassName = windowname; //////////////////窗口類名稱
pwin->hIconSm = LoadIcon(NULL, IDI_APPLICATION);

}

////////////////////////////打印文本函數定義////////////////////////////////
void geterrortext()
{
DWORD message = GetLastError();
TCHAR*szmessage =NULL;
TCHAR SZTitle = { 0 };
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, message, 0, (LPWSTR)&szmessage, 0, NULL);

MessageBox(NULL, szmessage, TEXT("錯誤"), MB_OK);
}

/////////////////////////////窗口過程定義///////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc; ///////////////////////////繪制時所需要的設備環境句柄

int xClient, yClient; //////////////////////////保存客戶區大小的變量(寬度:xClient,高度:yClient)

PAINTSTRUCT ps; ////////////////////////////繪制信息結構

wchar_t* WindowsName =L"Hello,Windows";

TCHAR* WindowS = TEXT("HWLLO,WINDOWS");

switch (message)
{
/////////////////////////////創建窗口時的第一個消息////////////////////////
case WM_CREATE:

hdc = GetDC(hWnd);
ReleaseDC(hWnd, hdc);
return 0;
////////////////////////////改變窗口大小時的消息///////////////////////////
case WM_SIZE:
xClient = LOWORD(lParam);
yClient = HIWORD(lParam);
return 0;
///////////////////////////窗口重繪消息////////////////////////////////////
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
TextOut(hdc, 100, 100, WindowsName, 10);
EndPaint(hWnd, &ps);
return 0;

////////////////////窗口銷毀時由WM_CLOSE引發的消息/////////////////////////
case WM_DESTROY:
PostQuitMessage(0);
return 0;

}
return DefWindowProc(hWnd, message, lParam, wParam);
}

大神們幫我看一下哪裡出錯了呀,下面是運行結果:

圖片說明

最佳回答:


return DefWindowProc(hWnd, message, lParam, wParam);
--->
return DefWindowProc(hWnd, message, wParam, lParam);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved