学习《WINDOWS程序》这本书,学的比较偷懒,好多程序没手打。所以记忆不是很牢固,知识比较容易忘记,写篇总结,正好可以让自己重复记忆,以后也可以看自己的。
WINDOWS编程,UNICODE编码,感觉没有啥好记,可能是我学的不精吧。然后了我们开始记忆WINDOWS编程比较重要的窗口和消息回顾。
先回忆类和函数吧,WINDOWS里面的类总是大写,一开始我学的一楞一愣的,书上不知道是我看的不仔细,还是什么,我感觉书写类的比较分散。
有了WNDCLASS类了,然后要对他注册.使用
ATOM
RegisterClass( __in CONST WNDCLASS *lpWndClass);
typedef
WORD
ATOM
;
typedef
unsigned
short
WORD
;
lpfn
while(GetMessage(&msg,NULL,0,0))//对消息进行检索
{
TranslaeMessage(&msg);//用于将虚拟键消息转换为字符消息。
DispatchMessage(&msg);//该函数分发一个消息给窗口程序
}
消息有分为队列消息与非队列消息
队列消息:使用者输入结果(输入有很多形式,比如鼠标,按键),也有时钟消息,退出消息
非队列消息:调用特特定函数
先列出一些,常用的消息,其他的慢慢复习的出来
WM_CREATE///第一次创建窗口会调用
WM_SIZE//客户区大小改变是调用,还有窗口第一次显示也调用
WM_SIZE//关闭程序
下面来说文本输出
嗯,先说一下消息吧,文本输出很多都是在WM_PAINT里面,然后当图形重新绘制的时候涉及到2个概念,
有效矩形//不需要重新绘制的区域
无效矩形//需要重新绘制的区域
如何判断是否需要重新绘制了,可以用InvaliddateRect(HWND hWnd,CONST RECT *lpRect,BOOL bFrase);
hWnd//表示所要重绘的窗体句柄
lpRect//表示重绘区域的结构体指针,NULL就是客户区
bFrase//true重新绘制背景false不重新绘制
进入下阶段吧,获取环境句柄
第一种方法hdc=BeginPaint(hwnd,&ps);
//添加你需要的东西吧
EndPaint(hwnd,&ps);
第二种方法hdc=Get(hwnd);
//添加你需要的东西
ReleaseDC(hwnd,hdc);
先分析第一种方法,hwnd窗口句柄,&ps是一个名为PAINSTRUCT的结构具体如下
typedef struct tagPAINSTRUCT
{
HDC hdc;//设别环境句柄
BOOL fEerase;//设置为0,意味着Windows在先前的BeginPaint函数中已经擦除了无效区域的背景
RECT rcPaint;//一个无效矩形,同时也是裁剪区域
BOOL fRestore;//系统 一般用不到
BOOL fInUpdate;//系统 一般用不到
BYTE rgbReserved[32];//系统 一般用不到
}PAINTSTURCT;
第一种与第二种的很重要的一个区别,给出书上2种需求说法
第一种:这种方法可以再处理WM_PAINT消息时使用
第二种:尽管最好让程序处理WM_PAINT消息是才更新整个客户区,但有时也会发现在处理非WM_PAITN消息绘制部分客户去也是有用的
如果使用第一种,使用完了就完了,但是使用第2种使用完了,会到WM_PAINT消息里面去
开始文本输出
TextOut(hdc,x,y,psText,iLength);//很明显的参数说明吧
至于像素神马的,我们下次再一起复习吧。
文本输出,字体这个很蛋疼的东西是需要复习的。
typedef struct tagTEXTMETRIC
{
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLead;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
//只关注前7个
}TEXTMETRIC,*PTEXTMETRIC
以上貌似也就够了。。。
然后就到了一个比较具体的东西了,就是滚动条。
我们先是说下按键消息吧
设置函数可以用SetScrollPos(hwnd,iBar,iPos,bRedraw);
用UpdateWindow(hwnd);立即更新无效区域
如果想做出效果比较好的滚动,可以加入一些其他的结构结合。