SKD4(note上)

微软提供了图形的界面API,叫GDI
如果你想画某个窗口,你必须拿到此窗口的HDC

#include <windows.h>
#include<tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include <string>

/*鼠标消息
* 键盘消息
* Onkeydown
* Onkeyup
* //键盘扫描码
* /lParam>>16&0ff
快捷键消息
菜单消息
控件消息
自定义消息
窗口消息
客户区域的概念(Client Aera)
非客户区


*/ 
using namespace std;
string g_Text;
VOID showerrormassage()
{
	LPVOID lpMsgBuf;
	FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER |/*  分别为FORMAT_MESSAGE_ALLOCATE_BUFFER由函数分配输出缓冲区,
  FORMAT_MESSAGE_FROM_SYSTEM表示程序将会在系统消息表资源中搜索所需消息,FORMAT_MESSAGE_IGNORE_INSERTS程序将会忽略搜索到消息中的插入序列。  */
		FORMAT_MESSAGE_FROM_SYSTEM |
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		GetLastError(),
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR)&lpMsgBuf,
		0, NULL);
	MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONINFORMATION);
	LocalFree(lpMsgBuf);
}

//热键消息
//热键消息需要注册
//RegisterHotKey()
//软件卸载的时候还要卸载这个注册
//所以ip号就是这么回事
//
//UnregisterHotKey注销的函数

//LRESULT OnHotkey(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
//	return TRUE;
//}

LRESULT Onchar(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	g_Text+=(char)wParam;
	TCHAR szBuf[MAXBYTE];
	if ((char)wParam == '\r')
	{
		g_Text += '\n';
	}
	wsprintf(szBuf, _T("Onchar %s\n"), g_Text.data());
	OutputDebugString(szBuf);
	//获取窗口HDC,非客户区GetWindowDC
	HDC hdc = GetDC(hwnd);
	//TextOut(hdc, 0, 0, g_Text.data(), g_Text.length());//这个API不支持回车
	//释放DC
		RECT rc;
	GetClientRect(hwnd, &rc);
	DrawText(hdc, g_Text.data(), g_Text.length(), &rc, DT_LEFT);//这个API支持换行不过有rect
	ReleaseDC(hwnd, hdc);
	return TRUE;
}
LRESULT OnCreate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	//初始化
   /* MessageBox(NULL,_T("onCrate"), _T("asm"), MB_OK);*/
	OutputDebugString(_T("[11syy]WM_CREATE\n"));
	return TRUE;
}//消息处理

LRESULT OnClese(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	/*MessageBox(NULL, _T("onClose"), _T("asm"), MB_OK);*/
	OutputDebugString(_T("[11syy]WM_ClOSE\n"));
	DestroyWindow(hwnd);
	return TRUE;
}
//LRESULT OnKeydown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	//获取键盘状态
//	BYTE KeyState[256];
//	if (!GetKeyboardState(KeyState))
//	{
//		return TRUE;
//	}
//
//	//键盘扫描码
//	BYTE SanCode = (UINT)lParam >> 16 & 0xff;
//	WORD ch;
//	ToAscii(wParam, SanCode, KeyState, &ch, 0);
//	TCHAR szBuf[MAXBYTE];
//	wsprintf(szBuf, _T("[asm] OnKeydown) % c\n"), ch);
//	OutputDebugString(szBuf);
//	return TRUE;
//}


//消息处理

LRESULT OnDestroy(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	/*  MessageBox(NULL, _T("onDestory"), _T("asm"), MB_OK);
	  */PostMessage(hwnd, WM_QUIT, 0, NULL);
	  OutputDebugString(_T("[11syy]WM_DESTROY\n"));
	  return TRUE;
}

//LRESULT OnMove(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	TCHAR szBuf[MAXBYTE];
//	int xpos = (int)(short)LOWORD(lParam);
//	int ypos = (int)(short)HIWORD(lParam);
//	wsprintf(szBuf, _T("[11syy]xpos:%d ypos:%d"), xpos, ypos);
//	PostMessage(hwnd, WM_QUIT, 0, NULL);
//	return TRUE;
//}
//LRESULT OnLButtonnDown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	int xpos = LOWORD(lParam);
//	int ypos = HIWORD(lParam);
//	TCHAR szBuf[MAXBYTE];
//	wsprintf(szBuf, _T("[11syy]xpos:%d ypos:%d\n"), xpos, ypos);
//	OutputDebugString(szBuf);
//	/*MessageBox(NULL, szBuf, _T("asm"), MB_OK);*/
//	return FALSE;
//}
//LRESULT OnLButtonnup(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	int xpos = LOWORD(lParam);
//	int ypos = HIWORD(lParam);
//	TCHAR szBuf[MAXBYTE];
//	wsprintf(szBuf, _T("[11syy]xpos:%d ypos:%d\n"), xpos, ypos);
//	OutputDebugString(szBuf);
//	//MessageBox(NULL, szBuf, _T("asm"), MB_OK);
//	return FALSE;
//}

//LRESULT onMouse(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	LRESULT lResult = FALSE;
//	switch (uMsg)
//	{
//	case WM_LBUTTONDOWN:
//	 lResult= OnLButtonnDown(hwnd, uMsg, wParam, lParam);
//		break;
//	}
//	return FALSE;
//}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	LRESULT lResult = FALSE;
	switch (uMsg)
	{
	case WM_CREATE:
		lResult = OnCreate(hwnd, uMsg, wParam, lParam);
		break;
	case WM_CLOSE:
		lResult = OnClese(hwnd, uMsg, wParam, lParam);
		break;
	case WM_DESTROY:
		lResult = OnDestroy(hwnd, uMsg, wParam, lParam);
		break;
	case WM_CHAR:
		lResult= Onchar(hwnd, uMsg, wParam, lParam);
	}

	if (!lResult) {
		return DefWindowProc(hwnd, uMsg, wParam, lParam);//默认窗口过程处理
	}
	return lResult;
}

//图形界面,窗口


int WINAPI _tWinMain(HINSTANCE hInstance,//应用程序示例句柄
	HINSTANCE hPrevInstance,//保留
	TCHAR* lpCmdline, //命令行参数,LPSTR可能会变成Unicode
	int nCmdShow) {//窗口显示方式
	//比如我们启动这个窗口,最大化,最小化
	/*MessageBoxA(NULL, "hell word ", "asm", MB_YESNO);*/\
		//int res = MessageBoxW(NULL, L"hell unicode", L"asm", MB_YESNO);
		//
		//if (res == 0) {
		///*	MessageBoxW(NULL, L"错误", L"asm", MB_OK);*/
		//	showerrormassage();
		//	return 0;
		//}程序》实例化》进程》多个窗口
		//1.注册窗口
		TCHAR  szWndclassName[] = { _T("chongmousyy") };

	WNDCLASSEX wc = { 0 };
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;//窗口类型
	wc.lpfnWndProc = WindowProc;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(NULL, IDC_HAND);//图标
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);//光标FDXX
	wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));//窗口背景颜色刷子
	wc.lpszClassName = szWndclassName;//窗口类名,窗口名字不可以为空
	wc.lpszMenuName = NULL;//窗口菜单
	if (RegisterClassEx(&wc) == 0)
	{
		showerrormassage();
		return 0;
	};
	//2.创建窗口
	TCHAR szWndName[] = { _T("翀某人") };
	HWND hwnd = CreateWindowEx(0,
		szWndclassName,
		szWndName,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL
	);
	if (hwnd == 0)
	{
		showerrormassage();
		return 0;
	}

	//3.显示跟新窗口
	ShowWindow(hwnd, SW_SHOWNORMAL);

	//4.消息循环(消息队列)
	BOOL bRET;
	MSG msg;
	while ((bRET = GetMessage(&msg, NULL, 0, 0)) != 0) {
		if (bRET == -1) {
			break;
		}
		else
		{
			//转发消息
			TranslateMessage(&msg);//转换键盘消息为字符消息
			DispatchMessage(&msg);//派发消息
		}
	}
	//5.消息处理


	//资源
	return 0;
}



在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Back~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值