入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

win32 (SDK)文本输出

创建时间:2016-11-19 投稿人: 浏览次数:886
Windows 分三大部分,kernel ,GDI ,User

设备环境,设备环境句柄是应用程序使用GDI函数的通行证。跟显示设备和打印设备挂钩,实际就是一个数据结构。
方法一:
  (相应WM_PAINT消息时候使用)
hdc=BeginPaint(hwnd,&ps);
//使用GDI函数
EndPaint(hwnd,&ps);
方法二:(适用任何时候)
  hdc=GetDC(hwnd)
//使用GDI函数
 ReleaseDC(hwnd,hdc);


TextOut是显示文本的重要函数。

   TextOut(hdc,400,300,TEXT("I Love You!"),11);

textout.c

/*
程序的关闭:
点击右上角 叉叉按钮  会发送 WM_CLOSE消息
(如果 需要 判断 用户是否确定 关闭 需要 捕获 WM_CLOSE消息 然后询问 然后 IDYES后 就执行DestroyWindow函数)
再执行DestroyWindow()函数  发送 WM_DESTROY消息  然后  就关闭的窗口
此时 再  执行 PostQuitMessage(0)  发送 WM_QUIT  到 线程的消息队列 使whlie(0)然后消息循环 停止 程序就停止了
*/
#include<Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParram, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	TCHAR * appname = TEXT("涵涵");
	TCHAR *title = TEXT("涵涵");
	MSG uMsg;
	WNDCLASS WndCls;
	HWND hWnd;
	WndCls.cbClsExtra = NULL;
	WndCls.cbWndExtra = NULL;
	WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //BRUSH画刷 Stock库存
	WndCls.hCursor = NULL;
	WndCls.hIcon = NULL;
	WndCls.hInstance = hInstance;
	WndCls.lpfnWndProc = WndProc;
	WndCls.lpszClassName = appname;
	WndCls.lpszMenuName = NULL;
	WndCls.style = CS_VREDRAW | CS_HREDRAW;
	//----------------
	RegisterClass(&WndCls);
	hWnd = CreateWindow(appname, title, WS_OVERLAPPEDWINDOW, 500, 500, 1000, 1000, NULL, NULL, hInstance, NULL);
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	/*
	这里 把 hWnd设置 成 NULL  就可以抓取 整个程序的所有消息  (包括 所有窗口 和所有线程)
	PostQuitMessage(0)函数  发送的消息是直接给 线程的消息队列
	GetMessage获取 WM_QUIT后  就使while(0) 程序 就结束了
	如果 不为 NULL就 无法获取 WM_QUIT
	*/
	while (GetMessage(&uMsg, NULL, 0, 0))   //最大条数 最小条数  
	{
		TranslateMessage(&uMsg);
		DispatchMessage(&uMsg);
	}
	return uMsg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;   //Handle Device Context
	PAINTSTRUCT ps; //每个窗口要有一个PAINTSTRUCT结构来记录一些绘制信息,PAINTSTRUCT结构保存了窗口绘制客户区的一些信息,例如,绘制客户区时是否要清除背景色,要更新的客户区的矩形区域的大小等等,
	RECT rect;
	LPSTR outStr = TEXT("I Love You!");
	switch (uMsg)
	{

	case WM_PAINT:
		//  PAINTSTRUCT在程序呼叫BeginPaint时,Windows会适当填入该结构的各个字段值。使用者程序只使用前三个字段,其它字段由Windows内部使用。hdc字段是设备内容句柄。
		hdc = GetDC(hWnd);
		TextOut(hdc, 1, 2, outStr, 11);
		
		ReleaseDC(hWnd, hdc);
		break;  //多条 语句 最好是 加case  break;(标准做法)
		//case BN_CLICKED:
		//MessageBox(hWnd, TEXT("你好"), TEXT("我好"), MB_YESNO);
		//case WM_PAINT:
		//MessageBox(hWnd, TEXT("你好"), TEXT("我好"), MB_YESNO);
	case WM_CLOSE:
		// ------WM_CLOSE  后面  判断  用户选择 是否销毁
		if (MessageBox(hWnd, TEXT("您是否要关闭我?"), TEXT("提示"), MB_YESNO) == IDYES)
		{
			DestroyWindow(hWnd);
		};
		break;
	case WM_DESTROY:
		//----这里 用来保存数据 或者   直接关闭
		PostQuitMessage(1);

		break;
		//case WM_LBUTTONDOWN:
		//MessageBox(hWnd, TEXT("您按下了左键"), TEXT("提示"), MB_OK);
/*	case WM_LBUTTONUP:
		MessageBox(hWnd, TEXT("您松下了左键"), TEXT("提示"), MB_OK);
		break;
		*/
		//case WM_NCLBUTTONDOWN:  //NC  noneClient   非客户区 按下
		//	MessageBox(hWnd, TEXT("您在非客户区按下了左键"), TEXT("提示"), MB_OK);
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
		break;
	}
	return 0;

	/*
	switch 里面的 return 0和 break的 区别在于 break会 跳出 整个 switch语句 执行 后面的其它语句  这里  会 跳出switch然后  执行后面 return 0
	返回0给操作系统  操作系统 又原封不动地给DispatchMessage函数
	---------------------------------------
	队列消息 是要经过 while的消息循环的 然后 进入  消息过程函数
	非队列消息 不经过 while消息 循环直接 (通过 某些函数产生)直接 进入 消息过程函数
	Ps:不要在 处理 某条 消息上 耗费太大时间 否则用户体验 会很差的
	*/
}


阅读更多
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。