1. 程式人生 > >基於WinAPI的視窗示例

基於WinAPI的視窗示例

實現的主要功能如下:

  1. 程式預設圖示為?,預設游標為左右箭頭,在指定位置輸出 文字訊息
  2. 單擊滑鼠左鍵時,彈出對應點的位置座標(注意座標轉換)
  3. 單擊鍵盤的上下左右鍵時,彈出對應的對話方塊(鍵盤訊息的處理方式)
#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;
}