WINDOWS程序设计 复习(1)

学习《WINDOWS程序》这本书,学的比较偷懒,好多程序没手打。所以记忆不是很牢固,知识比较容易忘记,写篇总结,正好可以让自己重复记忆,以后也可以看自己的。

WINDOWS编程,UNICODE编码,感觉没有啥好记,可能是我学的不精吧。然后了我们开始记忆WINDOWS编程比较重要的窗口和消息回顾。

先回忆类和函数吧,WINDOWS里面的类总是大写,一开始我学的一楞一愣的,书上不知道是我看的不仔细,还是什么,我感觉书写类的比较分散。

typedef struct _WNDCLASS {
UINT style;// 窗口类型
WNDPROC lpfnWndProc;//窗口处理函数
int cbClsExtra;//窗口扩展
int cbWndExtra;//窗口实例扩展
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的最小化图标
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜单
LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;//窗口类结构

有了WNDCLASS类了,然后要对他注册.使用

ATOM RegisterClass(  __in  CONST WNDCLASS *lpWndClass);
typedef WORD ATOM ;
typedef unsigned short WORD ;
lpfn
如果函数成功,返回值是唯一标识已注册的类的一个原子;如果函数失败,返回值为0
然后我们开始创建窗口(是窗口)
CreateWindow(szAppNname, //窗口类名称
TEXT("The Hello Program"),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格,或称窗口格式
CW_USEDEFAULT,//初始x坐标
CW_USEDEFAULT,//初始y坐标
CW_USEDEFAULT,//初始x方向尺寸
CW_USEDEFAULT,//初始y方向尺寸
NULL,//父窗口菜单句柄
NULL,//窗口菜单句柄
hInstance,//程序实例句柄
NULL);//创建参数
创建完了之后对窗口进行显示,可以多个窗口类对一个窗口进行创建,这也是为什么要弄个窗口要这么麻烦。
BOOL ShowWindow(HWND hWnd, int nCmdShow);//左边是窗口的句柄,右边是一些参数用来控制窗口
typedef struct tagMSG
{
HWND hwnd;//表示消息所属的窗口
UINT message;//message指定了消息的 标识符
WPARM wParam;//很多意思
LPARAM lParam,//很多意思
DWORD time;//投递到 消息队列中的时间
POINT pt;//鼠标位置
}MSG,*PMSG;

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);立即更新无效区域

如果想做出效果比较好的滚动,可以加入一些其他的结构结合。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值