win32 (SDK)文本输出
Windows 分三大部分,kernel ,GDI ,User
设备环境,设备环境句柄是应用程序使用GDI函数的通行证。跟显示设备和打印设备挂钩,实际就是一个数据结构。
方法一:
(相应WM_PAINT消息时候使用)
hdc=BeginPaint(hwnd,&ps);
//使用GDI函数
EndPaint(hwnd,&ps);
方法二:(适用任何时候)
hdc=GetDC(hwnd)
//使用GDI函数
ReleaseDC(hwnd,hdc);
TextOut是显示文本的重要函数。

阅读更多
设备环境,设备环境句柄是应用程序使用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。
- 上一篇: SQL Server 在指定数据库下 创建表(操作)
- 下一篇:没有了