自從我上次使用 Windows API 以來已經有好幾年了,我正在再次嘗試它。我有一個簡單的視窗(標題為“測驗”)。我在 WM_CREATE 下放入了 Window 訊息處理程式,2 個 CreateWindow 呼叫來創建一個靜態和一個編輯控制元件。我很確定坐標是不錯的(不重疊或超出視窗矩形)。我是否將電話置于錯誤的事件下?這只是一個簡單的視窗——不是 MDI 或 SDI 或類似的東西。這是我的整個程式的代碼。我希望這足以弄清楚我做錯了什么。我正在使用 Eclipse CDT 和 Cygwin 的 G 編譯器來構建它....:
#include <windows.h>
BOOL InitApplication(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hinstance, int nCmdShow);
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "";
wc.lpszClassName = "MainWindow";
return(RegisterClass(&wc));
}
BOOL InitInstance(HINSTANCE hinstance, int nCmdShow)
{
HINSTANCE hCurInstance = hinstance;
HWND hWnd = CreateWindow("MainWindow", "Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)(NULL), (HMENU)(NULL), hCurInstance, (LPVOID)(NULL));
if(!hWnd)
return(FALSE);
// Show the window and send a WM_PAINT message to the window
// procedure.
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return(TRUE);
}
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
CreateWindow("WC_STATIC", "&Test: ", SS_LEFT | WS_VISIBLE | WS_CHILD, 10, 10, 50, 20, hWnd, NULL, (HINSTANCE)(GetWindowLongPtr(hWnd, GWLP_HINSTANCE)), (LPVOID)(NULL));
CreateWindow("WC_EDIT", "", WS_BORDER | WS_TABSTOP | WS_VISIBLE | WS_CHILD | ES_LEFT, 60, 10, 50, 20, hWnd, NULL, (HINSTANCE)(GetWindowLongPtr(hWnd, GWLP_HINSTANCE)), (LPVOID)(NULL));
return(0);
default:
return(DefWindowProcA(hWnd, uMsg, wParam, lParam));
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmd, int nCmdShow)
{
BOOL fGotMessage;
MSG msg;
if(!InitApplication(hInstance))
return(FALSE);
if(!InitInstance(hInstance, nCmdShow))
return(FALSE);
while(((fGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0) && (fGotMessage != -1))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(msg.wParam);
}
uj5u.com熱心網友回復:
WM_CREATE是創建子控制元件的正確“事件”訊息。
您只是為子控制元件使用了錯誤的類名。這就是為什么你沒有看到他們。如果您檢查了這些CreateWindow()失敗呼叫的結果,您會注意到它CreateWindow()回傳 NULL,并且GetLastError()正在報告ERROR_CANNOT_FIND_WND_CLASS(1407)。
您需要替換"WC_STATIC"為"Static",并替換"WC_EDIT"為"Edit"。WC_STATIC或者,WC_EDIT您可以使用<commctrl.h>.
您也可以在創建系統定義的類時替換GetWindowLongPtr(hWnd, GWLP_HINSTANCE)為NULL,因為它們是全域注冊的,而不是按模塊注冊的。對于他們來說,HINSTANCE引數 ofCreateWindow/Ex()被忽略了。
附帶說明:您的GetMessage()回圈可以簡化為:
while (GetMessage(&msg, (HWND) NULL, 0, 0))
請參閱:GetMessage 何時回傳 -1?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/527219.html
標籤:C温纳皮
