第一个windows窗口

 #include <windows.h>
/* Displays "Hello, World!" in client area */ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口过程函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("HelloWin");//窗口类名称
char string[] = "Hello World!";
HWND hwnd;//窗口句柄
MSG msg;//消息结构
WNDCLASS wndclass;//定义窗口类结构体变量
/*下面代码填充窗口类信息*/
wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口样式
wndclass.lpfnWndProc = WndProc;//过程函数
wndclass.cbClsExtra = ;//扩展字段
wndclass.cbWndExtra = ;//扩展字段
wndclass.hInstance = hInstance;//当前实例句柄
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//设置程序图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//设置鼠标
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//用白色填充背景
wndclass.lpszMenuName = NULL;//菜单
wndclass.lpszClassName = szAppName;//类名
/*注册窗口类*/
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return ;
}
//创建窗口create window
hwnd = CreateWindow(szAppName, // window class name类名
TEXT("The Hello Program"), // window caption标题
WS_OVERLAPPEDWINDOW, // window style样式
CW_USEDEFAULT,// initial x position 横坐标原点
CW_USEDEFAULT,// initial y position 纵坐标原点
CW_USEDEFAULT,// initial x size
CW_USEDEFAULT,// initial y size
NULL, // parent window handle父窗口句柄
NULL, // window menu handle菜单句柄
hInstance, // program instance handle当前实例句柄
NULL); // creation parameters 传递给窗口 WM_CREATE消息的值的指针 一般为NULL
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
//消息循环,一直停在这里,退出消息循环就表示程序结束了
while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);//翻译
DispatchMessage(&msg);//分发
}
return msg.wParam;
}
/* 消息处理函数 */
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT("Hello World!"), -, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return ;
//发送结束请求,里面的参数为退出码
case WM_DESTROY:
PostQuitMessage();
return ;
}
//调用默认的过程函数
return DefWindowProc(hwnd, message, wParam, lParam);
}

首先是通过WNDCLASS这个结构体来告诉系统我们要创建一个窗口。

 ypedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;

设置结构内的不同的字段,调用RegisterClass函数来告诉系统,要注册一个这样的窗口类型。

接下来就是通过调用函数CreateWindow创建一个刚才注册的窗口类型。

 #define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#ifdef UNICODE
#define CreateWindow CreateWindowW
#else
#define CreateWindow CreateWindowA
#endif // !UNICODE

创建好的窗口还没有显示,这就要调用函数ShowWindow来显示,以及UpdateWindow来更新。

ShowWindow(
_In_ HWND hWnd,
_In_ int nCmdShow); UpdateWindow(
_In_ HWND hWnd);

消息循环。GetMessage函数从消息队列中取得消息。TranslateMessage函数 转移某些键盘消息。DispatchMessage函数将消息发送给窗口消息处理程序。

再来看WndProc这个函数内部。BeginPaint 开始绘制窗口。GetClientRect 取得窗口显示区域的大小。DrawText 显示字符串。EndPaint 结束绘制窗口。PostQuitMessage 在消息队列中插入一个「退出程序」消息。DefWindowProc 执行内定的消息处理。

程序通常不直接呼叫窗口消息处理程序,窗口消息处理程序通常由Windows本身呼叫。通过呼叫SendMessage函数,程序能够直接呼叫它自己的窗口消息处理程序。

处理消息。

WndProc处理的第一个消息为WM_PAINT。当窗口显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个消息通知程序。wndclass结构的style字段设定为标志CS_HREDRAW和CS_VREDRAW,这样的格式设定指示Windows,改变窗口的大小、窗口最小化以及移动窗口后,显示区域的显示内容重新变得无效。

GetClientRect (hwnd, &rect) ;

第一个参数是程序窗口的句柄。第二个参数是一个指标,指向一个RECT型态的rectangle结构。该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗口显示区域的尺寸。left和top字段通常设定为0,right和bottom字段设定为显示区域的宽度和高度(像素点数)。

DrawText(hdc, TEXT("Hello World!"), -, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);

DrawText可以输出文字(正如其名字所表明的一样)。由于该函数要输出文字,第一个参数是从BeginPaint传回的设备内容句柄,第二个参数是要输出的文字,第三个参数是 -1,指示字符串是以字节0终结的。

DrawText最后一个参数是一系列位旗标,它们均在WINUSER.H中定义(虽然由于其显示输出的效果,使得DrawText像一个GDI函数呼叫,但它确实因为相当高级的画图功能而成为User模块的一部分。此函数在/Platform SDK/Graphics and Multimedia Services/GDI/Fonts and Text中说明)。旗标指示了文字必须显示在一行上,水平方向和垂直方向都位于第四个参数指定的矩形中央。因此,这个函数呼叫将让字符串「Hello World!」显示在显示区域的中央。

一旦显示区域变得无效(正如在改变大小时所发生的情况一样),WndProc就接收到一个新的WM_PAINT消息。WndProc通过呼叫GetClientRect取得变化后的窗口大小,并在新窗口的中央显示文字。

case   WM_DESTROY:
PostQuitMessage();

WM_DESTROY消息指示,Windows正在根据使用者的指示关闭窗口。单击Close按钮或者在程序的系统菜单上选择 Close时发生的。

return DefWindowProc(hwnd, message, wParam, lParam);

结构的wParam字段是传递给PostQuitMessage函数的值(通常是0)。然后return叙述将退出WinMain并终止程序。

windows程序设计.窗口.的更多相关文章

  1. Windows程序设计-窗口和消息

    本章内容比较少,没有代码类的内容,这里付思维导图一章,看起来比较清晰.

  2. 窗口!窗口!- Windows程序设计(SDK)003

    窗口!窗口! 让编程改变世界 Change the world by program 内容节选: 在前边两节课的例子中,我们通过 MessageBox 函数创建一个消息框程序,消息框其实就是用来跟用户 ...

  3. Windows程序设计笔记(二) 关于编写简单窗口程序中的几点疑惑

    在编写窗口程序时主要是5个步骤,创建窗口类.注册窗口类.创建窗口.显示窗口.消息环的编写.对于这5个步骤为何要这样写,当初我不是太理解,学习到现在有些问题我基本上已经找到了答案,同时对于Windows ...

  4. Windows 程序设计

    一.Win32 API /******************************************************************** created: 2014/04/1 ...

  5. windows 程序设计自学:添加图标资源

    #include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...

  6. 《Windows程序设计第5版》学习进度备忘

    书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...

  7. Windows程序设计学习笔记(1):一个简单的windows程序

    <Windows程序设计>(第五版)(美Charles Petzold著) #include<windows.h> LRESULT CALLBACK WndProc(HWND, ...

  8. Windows 程序设计(4) MFC 03 -系列学习

    本文整体目录和绝大部门内容来自 [鸡啄米网站]的MFC系列文章,欢迎支持原创 (一)VS2010/MFC编程入门之前言 VC++全称是Visual C++,是由微软提供的C++开发工具,它与C++的根 ...

  9. 关于《Windows程序设计(第五版)》中一个实例程序的疑问

    最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...

随机推荐

  1. Android 开发工具下载中文网站

    Android官方网站(develop.android.com)因为被墙而无法访问.这时可以访问中文网址: http://wear.techbrood.com/ SDK Manager 代理及安装文件 ...

  2. 实现LinearLayout(垂直布局,Gravity内容排布)

    首先上Gravity的代码,Android原版的Gravity搞得挺复杂的,太高端了.但基本思路是使用位运算来做常量,我就自己消化了一些,按自己的思路来实现. 先上代码,在做分析. package k ...

  3. ucontext-人人都可以实现的简单协程库

    ucontext的介绍 http://blog.csdn.net/qq910894904/article/details/41911175 协程的介绍 https://en.wikipedia.org ...

  4. mysql中字符串类型char(n)和varchar(n)的区别

    n的含义 根据网络上找到的结果(不能保证准确),在5.0.3以后版本中,n均代表字符数,而不是字节数:我用来测试的版本是5.7.20,该版本中,n表示字符数. 验证过程如下 建表 CREATE TAB ...

  5. jmeter 正则表达式提取

    引用名称:自己定义的变量名称,后续请求将要引用到的变量名,如填写的是:id,后面的引用方式是${id} 正则表达式:提取内容的正则表达式,相当于lr中的关联函数 [()     括起来的部分就是需要提 ...

  6. C++模式学习------原型模式

    原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.意思就是从A的实例得到一份与A内容相同,但是又互不干扰的实例B. class base { public : base(co ...

  7. ORA-01034和ORA-27101的解决方法

    问题所在: 1.要登录的数据库实例内容配置内容错误,联系负责该机子的管理员看原因

  8. 【刷题】BZOJ 2157 旅游

    Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...

  9. linux内核分析 第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程

    笔记: 实验:使用gdb跟踪分析一个schedule()函数

  10. gitlab相关

    1.gitlab的概述 1.gitlab是什么 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 基础功能免费,高级功能收费 2.为什么要使用gitla ...