基於WinAPI的視窗示例
阿新 • • 發佈:2019-01-02
實現的主要功能如下:
- 程式預設圖示為?,預設游標為左右箭頭,在指定位置輸出 文字訊息
- 單擊滑鼠左鍵時,彈出對應點的位置座標(注意座標轉換)
- 單擊鍵盤的上下左右鍵時,彈出對應的對話方塊(鍵盤訊息的處理方式)
#include "windows.h" #include "stdio.h" LRESULT CALLBACK DealMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT pen; HDC dc; TCHAR *PP = L"你好,Windows"; switch (uMsg) { //滑鼠左鍵按下 case WM_LBUTTONDOWN: { TCHAR buf[1024] = {0}; int x = 10, y = 10; POINT pt;//CPoint pt; GetCursorPos(&pt);//該函式檢取游標的位置,以螢幕座標表示, 如果為了與TextOut 相比的話,則需要將螢幕座標轉換為客戶區座標 ScreenToClient(hWnd, &pt);//的將螢幕座標轉換為客戶區座標//TextOut中就是客戶區座標 x = pt.x; y = pt.y; wsprintf(buf,TEXT("x = %d , y = %d"),x,y); MessageBox(hWnd,buf,TEXT("座標"),MB_OK); } break; //關閉程式 case WM_DESTROY://WM_QUIT//只有發這個命令時,關閉除錯程式時,程式碼上的除錯才會結束 PostQuitMessage(2); break; case WM_PAINT://輸出文字 { dc = BeginPaint(hWnd,&pen); TextOutW(dc,20,20,PP,wcslen(PP));//客戶區座標 EndPaint(hWnd,&pen); break; } case WM_KEYDOWN://當有鍵盤輸入事件時,會產生 WM_KEYDOWN 訊息 { switch(wParam)//虛擬鍵 { case VK_LEFT: MessageBox(hWnd,TEXT("向左"),TEXT("座標"),MB_OK); break; case VK_UP: MessageBox(hWnd,TEXT("向上"),TEXT("座標"),MB_OK); break; case VK_RIGHT: MessageBox(hWnd,TEXT("向右"),TEXT("座標"),MB_OK); break; case VK_DOWN: MessageBox(hWnd,TEXT("向下"),TEXT("座標"),MB_OK); break; case VK_RETURN: MessageBox(hWnd,TEXT("鍵盤Enter"),TEXT("座標"),MB_OK); break; } break; } default: return DefWindowProc(hWnd, uMsg,wParam, lParam); } return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hWnd; MSG msg; WNDCLASS cs; DWORD dWord; cs.cbClsExtra = 0; cs.cbWndExtra = 0;//這個寫錯了,寫成了第一個引數,導致註冊類不成功!!!!! cs.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//畫刷北京BLACK_PEN cs.hCursor = LoadCursor(NULL,IDC_SIZEWE); cs.hIcon = LoadIcon(NULL,IDI_QUESTION); cs.hInstance = hInstance; cs.lpfnWndProc = DealMessage; cs.lpszClassName = TEXT("ABC"); cs.lpszMenuName = NULL; cs.style = nShowCmd; if (!RegisterClass(&cs))//這裡可以檢視是否註冊成功//返回非零是成功,返回零是失敗 { MessageBox(NULL,TEXT("註冊類失敗,請檢查引數是否成功設定"),TEXT("座標"),MB_OK); } hWnd = CreateWindow(TEXT("ABC"), TEXT("hello,windows"), WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, CW_USEDEFAULT,CW_USEDEFAULT ,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);//CreateWindow中視窗類與 WNDCLASS中視窗類名必須一樣才可以,否則也是執行不了 if (!hWnd) { return 0; } MoveWindow(hWnd,30,30,580,480,TRUE);//相對整個桌面螢幕的左上角。。。測試過 ShowWindow(hWnd,SW_NORMAL); UpdateWindow(hWnd); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 1; }