当前位置: 首页 > article >正文

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;
}



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


http://www.kler.cn/news/330993.html

相关文章:

  • 好玩的进3D度条
  • 怎么查看是公网ip还是私网ip
  • 【web安全】——sql注入
  • 使用 Qt 和 SQLCipher 实现 SQLite 数据库加密与解密
  • 【java数据结构】顺序表
  • .Net 6.0 监听Windows网络状态切换
  • RISC-V开发 linux下GCC编译自定义指令流程笔记
  • 《开题报告》基于SSM框架的电影评论网站的设计与实现源码++学习文档+答辩讲解视频
  • H.264编解码 - I/P/B帧详解
  • C++七种异常处理
  • 【重学 MySQL】五十五、浮点和定点数据类型
  • 排序算法之——归并排序,计数排序
  • [rk3588 debain]cpu死锁问题解决
  • vue.js 原生js app端实现图片旋转、放大、缩小、拖拽
  • LeetCode讲解篇之5. 最长回文子串
  • 股票接口api,如何用excel获得股票实时数据
  • OpenAI 开发者大会2024
  • vue的el-button防止重复点击
  • 大厂校招:海能达嵌入式面试题及参考答案
  • Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新