《C语言到底能干什么》1.5 在窗口上写上“Hello World”(高手莫看)
1.5 在窗口上写上“Hello World”
再次声明:高手莫看,浪费时间
这一节我们乘胜追击,来继续深入学习下,学习窗口处理时间的东东。
也许你以前听说过,windows系统是消息驱动的,可是可能根本就不知道什么消息,更不知道什么消息驱动了。
其实什么是消息呢,说白了就是我们点鼠标击键盘而程序发生反应,消息是一种数据,就是我们点鼠标击键盘后,系统把我们的操作封装到数据中,
然后发送给程序,让程序对我们点鼠标击键盘的动作做出反应,当然程序也可以置之不理。Windows可是一个多任务的系统,
而且同时可能产生很多的击键动作,那么同时可能能会有很多消息,windows系统为了更好的管理维护这些消息,
就把这些消息加入消息队列中,消息队列其实就是消息的集合。
学过VB的人知道,VB中的程序是事件驱动的,因为一般都是发生时,调用相应的事件处理函数,所以整个处理过程都好像是事件引发的一样。
这里的事件就是指我们击键的动作等。
学过JAVA的人知道,JAVA中有事件适配器,来捕获相应的事件,并交给相应的处理方法进行处理。
其实三种语言的处理过程也都是大同小异,只不过JAVA和VB把这些处理过程给封装了,VB尤其封装的更厉害,所以编程者不必考虑和知道这中间的细节问题,
仍然可以编写出实用的程序,但正是由于细节的原因,用VB的开发的程序并不能高效地处理问题。
而C语言本身就是面向过程的语言,所以这一过程可以用C语言更好地表现出来,这也是我用C而不用C++的原因之一。
通过前几节的学习,我们知道了,在窗口程序中都有一个处理窗口的函数,其实所有的消息将会得到怎样的处理,都是此函数安排的。
现在大家再回去看看那个程序代码和注释,相信应该能明白些了吧。
系统产生的消息是不断的,但是中间是有间隔的,程序要想知道有没有自己的消息,得不停地去问系统,问系统当前有没有属于自己的消息,
这就需要一个循环来实现了。
下面先看下前两节种用到的消息循环代码:
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);//翻译消息
DispatchMessage(&Msg);//分派消息
}
Windows为消息定义一种新的数据类型MSG,用于保存消息的相关信息。在windows中GetMessage函数从消息队列种取得消息,
填写好MSG结构并返回,如果获取的消息是WM_QUIT消息,则退出循环。
TranslateMessage将MSG结构传给Windows进行一些键盘消息的转换,当有键盘按下或者放开时,Windows产生WM_KEYDOWN
和WM_KEYUP或WM_SYSKEYDOWN和WM_SYSKEYUP消息(像WM_KEYDOWN这些都是微软定义的一些宏,是什么意思,看字面意思就可以知道了),
但是这些消息的参数种包含的是按键的扫描码(暂时不用理会),转换成常用的ASCII码要经过查表,很不方便,TranslatMessage遇到键盘消息
则将扫描码转换成ASCII码并在消息队列种插入WM_CHAR或WM_SYSCHAR消息,参数就是转换好的ASCII码,如此一来,要处理键盘消息的话只要是
处理WM_CHAR消息就好了。非键盘消息TranslateMessage则不做处理。
最后,由DispatchMessage将消息发送到窗口对应的窗口过程去处理。窗口过程返回后DispatchMessage函数才返回,然后开始新一轮的消息循环。
想想我们这节的目的是为了在洁白的窗口种写下“Hello World”,那么我们怎么来留下我们的笔迹呢?窗口我们是能做出来了,那么怎么在上面写东西呢,
等等,在上面写东西的前提是不是窗口做出来之后,当初我是这么想的,后来看到别人的代码才知道原来可以在窗口绘制的过程就绘制“Hello world”了。
Windows有时真是个细心的家伙,把窗口创建到显示的一瞬间又给划分了很多小的过程。在绘制窗口时,Windows会产生WM_PAINT消息,
那么我们在得到这个个消息的时候,来留下我们的笔迹,岂不就是下手最早的时刻。其实Windows在屏幕上输出文字和图像是一样的,都是在屏幕上画,
和我们在纸上画图和写字是一样的,都是用笔来画的,只不过用的笔不一样而已,如果牵强用一支笔去做所有的工作,效果并不会理想的。Windows的笔也是这样的,
不过这些笔是函数而已,画图和画文字的函数不一样而已。
下面就接着上节修改的代码继续修改,必要的注释和改变的地方我会标明的
#define CUR 0x1000 // 预定义光标的id
HDC hDC; // HDC是指设备上下文(暂时不用管,只要能这样用就可以了)的句柄
// PAINTSTRUCT要绘制的信息,详情请登陆http: // msdn.microsoft.com/en-us/library/dd162768(VS.85).aspx
// 了解下就可以了,没什么重要的东西
PAINTSTRUCT paint;
RECT rect; // RECT用来存储窗口信息的结构,只要是窗口的坐标、宽度和高度。
// 回调函数
LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
switch (Msg) // 处理消息过程,什么是消息,下节再讲
{
case WM_PAINT:
// BginPaint做些绘画的开始工作,填充PAINSTURCT结构,返回设备上下文(暂时不用理解)句柄
hDC = BeginPaint(hWnd, & paint);
// GetClientRect用来获取窗口所在客户区的位置大小信息
GetClientRect(hWnd, & rect);
// DrawText就是Windows用来“画字”的笔了,DT_*之类是指文字的样式,看字面意思也能看懂的
// 有多少样式呢,可以查看这里http: // msdn.microsoft.com/en-us/library/ms901121.aspx
// 本例中是单线、水平居中和竖直居中。
DrawText(hDC, " Hello World! " , - 1 , & rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// EndPaint就是做些收尾的工作了。
EndPaint(hWnd, & paint);
break ;
case WM_DESTROY: // 响应鼠标单击关闭按钮事件
PostQuitMessage( 0 ); // 退出消息队列,至于什么是消息队列,下节说
return 0 ; // 退出函数
}
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
// 主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
char * cName = " myWindow " ;
WNDCLASSEX wc;
HWND hWnd;
MSG Msg;
wc.cbClsExtra = 0 ;
wc.cbWndExtra = 0 ;
wc.cbSize = sizeof (WNDCLASSEX);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 通过函数来设置一个白色的背景,这里大家设置为NULL看看,会很有趣的
wc.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(CUR)); // 这里改了,来载入光标资源
wc.hIcon = NULL; // 不设置
wc.hIconSm = NULL; // 不设置
wc.hInstance = hInstance; // 当前程序的句柄,hInstance是有系统给传递的
wc.lpfnWndProc = WinProc; // 窗口处理过程的回调函数。
wc.lpszClassName = (LPSTR)cName; // 窗口类的名字。
wc.lpszMenuName = NULL; // 目录名,不设置
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx( & wc); // 在系统中注册
hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,cName, " 我的窗口我喜欢 " ,WS_OVERLAPPEDWINDOW,
200 , 100 , 600 , 400 ,NULL,NULL,hInstance,NULL); // 创建窗口,窗口标题为"我的窗口我喜欢"
if (hWnd == NULL)
{ // 容错处理
MessageBox(NULL, " There's an Error " , " Error Title " ,MB_ICONEXCLAMATION | MB_OK);
return 0 ;
}
ShowWindow(hWnd,nShowCmd); // 显示窗口
UpdateWindow(hWnd);
// 下面是对消息的循环处理,大家先不必管这些,下节课我会细说的
while (GetMessage( & Msg,NULL, 0 , 0 ))
{
TranslateMessage( & Msg); // 翻译消息
DispatchMessage( & Msg); // 分派消息
}
return Msg.message;
}
最终运行结果:
转载于:https://www.cnblogs.com/20090802/archive/2009/12/26/WahtCanCDo1_5.html
《C语言到底能干什么》1.5 在窗口上写上“Hello World”(高手莫看)相关推荐
- 加油机程序C语言,不要认为简单!!要多少架飞机?怎样写程序?哪位高手能把程序写出来?...
.setSubOil("供油");//右边起的两架飞机供油给 nPlane[2] nPlane[2].setAddOil("加油"); nPlane[2].se ...
- C 语言究竟能干什么
C语言究竟能干什么 序言 鉴于现在已经大三了,很多同学很迷茫,自己学的东西到底能做什么,将来自己到底能干什么?我不想看着同学迷茫的面孔, 特别是几个好兄弟,有几个想学习编程,但又苦苦找不到门路的兄弟, ...
- python语言能干什么-Python这么火到底能干啥?
问题:Python这么火到底能干啥? 答: ·人工智能 Python是最适合人工智能的编程语言.同时,Python语法简洁清晰,简单易学,运行速度非常快,具有强大的库,可移植性,解释性,面向对象,可扩 ...
- 学python培训到底能干嘛
Python是在人工智能领域发挥着很重要的作用的,现在依旧有很多人对Python这项技术不是很了解,学Python培训到底能干嘛?下面小编来为大家做下详细的介绍. python其实并不难学,对于初学者 ...
- python入门先学什么-所以学完 Python 入门课的孩子到底能干啥?
原标题:所以学完 Python 入门课的孩子到底能干啥? 画个四色螺旋线 ▼ 绘制一个五彩橡皮筋球 ▼ 弄一朵同心花瓣 ▼ 螺旋花瓣 ▼ 随机万花筒 ▼ 还可以搞些表情包 ▼ 以上是学完Python ...
- 学python能做什么-学Python后到底能干什么?网友:我太难了
原标题:学Python后到底能干什么?网友:我太难了 一起涨姿势 感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越 ...
- python编程是干嘛的-Python这么火到底能干啥?
问题:Python这么火到底能干啥? 答: ·人工智能 Python是最适合人工智能的编程语言.同时,Python语法简洁清晰,简单易学,运行速度非常快,具有强大的库,可移植性,解释性,面向对象,可扩 ...
- 学python后到底能干什么-学Python后到底能干什么
Python是一种什么语言? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言. 比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Ja ...
- python能干什么-Python这么火,学完到底能干什么
对计算机行业有所了解的人应该都听说过很多流行的编程语言,比如难学的C语言,非常流行的Java,用于网页开发的PHP等,Python也是编程语言的一种. 我们先来普及一下编程语言的基础知识,用任何一种语 ...
最新文章
- php上传头像的代码,php头像上传预览实例代码
- 【响应式Web前端设计】css如何设置边框的圆角样式?border-radius属性设置圆角样式(图 文)
- [开源] .NETCore websocket 即时通讯组件---ImCore
- 修改系统UIAlertAction的按钮颜色
- 【资源下载】《Pytorch模型训练实现教程》(附下载链接)
- linux 内核模块开发,linux内核模块开发(示例代码)
- [bzoj1412][ZJOI2009]狼和羊的故事
- 以后再别这样做,否则你的苹果华为将挂在墙上
- 让LinqToSQL使用Web.Config中的链接字符串(修改Settings.Designer.cs)
- 海康威视 摄像头 RTMP 转 FLV
- metasploit中msf批量监测
- airpod蓝牙耳机音量大解决办法_airpods使用方法_airpods怎么调音量
- C++:什么是RAII? | 智能指针的初步讲解 | 智能指针是为了避免什么问题?| 被遗弃的auto_ptr
- wireshark推荐书籍
- 解决:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x81 in position 18: illegal multibyte sequence
- mysql 节假日判断_sql 节假日判断(春节、中秋、国庆、周末等)
- 【Vue项目复习笔记】详情页的展示
- FireStart教程:基于SharePoint的出差报销流程二
- Android 返回键
- Linux修改文件时间或创建新文件:touch