底層窗口實現

#include<Windows.h>
#include<stdio.h>
//窗口過程函數
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	//默認處理
	
	switch (uMsg)
	{
	case WM_CLOSE:
		DestroyWindow(hwnd);         //觸發
		break;
	case WM_DESTROY:           //發送退出
		PostQuitMessage(0);
		break;
	case WM_LBUTTONDOWN:         //點擊左鍵
	{
		int xPos;
		int yPos;
		xPos = LOWORD(lParam);
		yPos = HIWORD(lParam);

		TCHAR buf[1024];
		wsprintf(buf, TEXT("x=%d ,y=%d"), xPos, yPos);
		//第一個參數 所屬窗口 顯示內容 標題內容  關聯按鍵類型
		MessageBox(hwnd, buf, TEXT("鼠標按下"), MB_OK);
	}
		break;
	case WM_KEYDOWN :     //鍵盤消息
		MessageBox(hwnd, TEXT("jianpan"), TEXT("鼠標按下"), MB_OK);
		break;
	case WM_PAINT:        //繪圖消息
	{
		PAINTSTRUCT ps;   //繪圖結構體
		HDC hdc= BeginPaint(hwnd, &ps);
		//繪製文字
		TextOut(hdc, 100, 100, TEXT("hello"), strlen("hello"));
		EndPaint(hwnd, &ps);
	}
	    break;
	default:
		break;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	/*1.設計窗口
	2.註冊窗口
	3.創建窗口
	4.顯示更新窗口
	5.通過循環看取消息
	6.處理消息*/
	//1
	WNDCLASS wc;  //創建窗口類
	wc.cbClsExtra = 0;     //類額外內存0
	wc.cbWndExtra = 0;//窗口額外內存0
	wc.hbrBackground = GetStockObject(WHITE_BRUSH);            //設置背景
	wc.hCursor = LoadCursor(NULL, IDC_HAND);                                   //光標形狀   第一個參數爲null時候默認系統光標
	wc.hIcon = LoadIcon(NULL,IDI_HAND );            //設置圖標 第一個參數爲null時候默認系統
	wc.hInstance = hInstance;       //當前實例句柄
	wc.lpfnWndProc = WindowProc;          //窗口過程函數
	wc.lpszClassName = TEXT("WINDOW");          //窗口類名
	wc.lpszMenuName = NULL;            //窗口菜單名
	wc.style = 0;               //窗口風格代表默認
 
	//2.註冊窗口
	RegisterClass(&wc);         
	/*3.創建窗口
	lpClassName, 類名    wc lpszClassName
	lpWindowName, //窗口名 WINDOW
	dwStyle, x, y, \      顯示風格         創建窗口起始座標
		nWidth,      寬
		nHeight,     高
		hWndParent      父窗口  NULL
		, hMenu,       菜單  NULL
		hInstance,     實例句柄 hInstance
		lpParam    其他參數  NULL
		*/
	
	HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("TEXT WINDOW"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	//4顯示更新

	ShowWindow(hwnd,SW_NORMAL );                   //
	UpdateWindow;

	//5通過循環取消息
	/*
	
	  HWND        hwnd; 主窗口
    UINT        message;消息名稱
    WPARAM      wParam;附加消息鍵盤
    LPARAM      lParam;附加消息 鼠標 左右箭
    DWORD       time;消息產生時間
    POINT       pt; 附加消息 鼠標 xy座標
	
	*/
	MSG msg;
	/*
	   _Out_ LPMSG lpMsg, 消息結構體
    _In_opt_ HWND hWnd,   捕獲消息
    _In_ UINT wMsgFilterMin,   過濾最小消息數量
    _In_ UINT wMsgFilterMax);   過濾最大消息數量  0代表捕獲所有消息
	*/
	while (1)
	{
		if (GetMessage(&msg, NULL, 0, 0) == FALSE)       //代表捕獲全部消息
		{
			break;
		}
		TranslateMessage(&msg);//翻譯消息
		DispatchMessage(&msg);      //分發消息


	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章