《21天学通Windows编程》笔记

1.在Windows里定义数据类型的一些标准前缀

前缀

数据类型

c

字符(char

cb

用于定义对象(一般为一个结构)尺寸的整数

s

短整数(short

n

整数(integer

sz

’/ 0’ 结尾的字符串

b

字节

i

int(整数)

x

短整数(坐标x

y

短整数(坐标y

f

bool

w

(WORD,无符号短整数)

l

长整数(LONG)

h

HANDLE(无符号int)(UINT

m_

类成员变量

fn

函数(function)

dw

双字(DWORD,无符号长整数)

  2Windows程序采用Pascal的调用规则,当参数传递给过程时,它们被从左到右依次压入栈中,因为这种方式更快一些。传统的C程序则使用相反的顺序(从右至左)。

3 Windows 是一个面向消息或事件的环境,这是什么意思?

DOS环境中,用户直接与程序通信。但是在Windows环境中用户的行为首先被操作系统获取,然后以消息或事件的方式传给应用。这个Windows系统给了Windows应用某种自主和独立性(在DOS环境中完全不具备)。

 

4BeginPaintGetDC获取设备描述表,应用场合的不同:

       WM_PAINT消息处理函数中,要使用BeginPaint来获取设备描述表。而不要使用GetDC,这样可能会引起一些不可预料的问题,比如:当你的窗口从别的窗口下面调到桌面最上层时,或者你的窗口需要重绘时,窗口可能不能正常恢复。

当你不是在处理WM_PAINT消息,但要访问设备描述表时要使用GetDC

 
5
.确定字符串长度的方法:

C语言中可以用内部函数 strrlen

Windows有自己的库函数 lstrlen。用法:lstrlen(String)

 
6
.分析函数:

GetClientRect(hwnd,&Rect);

DrawText(PaintDC,”Show Text”,-1,&Rect,DT_CENTER);

DrawText中的RECT参数Rect指定了显示字符串的区域,在这个例程中,使用了GetClientRect函数来取得整个客户区。

 

 

第五天 鼠标和键盘

 

1.  WM_CHARWM_KEYDOWN消息之间的区别:

要用WM_CHAR消息来读取字母数字键,不要用它来检测用户是否按下了功能键或方向键。

要用WM_KEYDOWN消息来确定是否按下了功能键或方向键,不要用它来读取字母数字键。

每当一个键被按下的时候,都会发送一条WM_KEYDOWN消息,然而当这条消息被送往窗口过程的时候,Windows还没有翻译被按下的键。因此不能确切的知道到底按下了那个键。WM_CHAR消息是能够确切的找出用户按下了哪个字母数字键的最理想的方法。

 

2.在Windows环境中,系统键是Alt。当你按下了Alt键,你便按下了系统键。

 

3.大多数消息都有两个宏与之相关,第一个宏被称为消息处理函数(WM_XXX),第二个宏的形式为:FORWARD_WM_XXX,其目的是:将消息返还给缺省的窗口过程。

       要从一个消息处理函数中把消息继续传递给DefWndProc,就要使用FORWARD_WM_XXX宏。如下面处理系统键消息的响应函数:KeyMouse_OnSysKey(HWND hwnd,UINT vk,BOOL fDown,int cRepeat,UINT flags)中,

       if(fDown)

       {  ……

              FORQWARD_WM_SYSKEYDOWN(hwnd,vk,cRepeat,flags,KeyMouse_DefProc);

       }else{……}

 

11 各种控制通信,使用EnumFontFamilies回调函数

 

1SendMessage PostMessage

       二者看起来很相似,其最基本的目的是通知一个指定的窗口去完成一项工作。但实际上它们是不同的。

       如果时间是关键因素,也就是说你要确保在SendMessage函数结束之前消息已被处理,要使用SendMessage函数。要记住,直到消息处理完毕以后,SendMessage函数才返回。     如果可以推迟消息的处理,可以使用PostMessage函数。它把消息放入消息队列。

       SendMessage将消息直接传递给适当的窗口过程,而PostMessage将消息放入应用的消息队列,因此,PostMessageSendMessage慢一些。

 

2.回调函数

       回调函数是由Windows直接调用的函数,而不是由你的应用程序中的其他例程调用的,通常你需要用MakeProcInstance函数把回调函数的地址传给Windows,以保证该回调函数能访问你的程序中的数据。

 

3.每一个控制都有两类常数与之相关,一类帮助你定义它的风格和它的表现形式,这一类常数通常在CreateWindow函数中使用。第二类帮助你与控制通信,这些常数通常在SendMessagePostMessage函数中使用。

       以列表框(ListBox)为例,在你设计对话框时可以给CreateWindow函数传递列表框风格(LBSLBStyle),如LBS_STANDARDLBS_MULTIPLSEL。然而当你欲与列表框通信时,应使用本章所列出的列表框消息(LB):LB_GETSELLB_GETTEXTLB_SETSEL

 

14 窗口风格

 

1.  GetClientRectGetWindowRect函数之间的区别是什么?

GetClientRect函数获取用窗口左上方的坐标表示的一个窗口的尺寸,其左上方的坐标总是表示为(00)。

GetWindowRect查询用窗口左上角表示的窗口位置,窗口左上角用其相对于整个屏幕的位置表示。

 

2.  WS_OVERLAPPEDWINDOW风格的作用是什么?

用于定义一个标准窗口,这个窗口有一个边框、一个标题栏、一个系统菜单以及最小化和最大化框。

 

15 对话框与映像模式

 

1.  映像模式:

是定义设备单位与逻辑单位之间的关系,以及x轴和y轴的方向。例如,缺省时使用MM_TEXT映像模式,其约定内容是,窗口中的每个计量单位,等于一个像素。

 

2.  逻辑坐标系统:

监视器上的物理坐标系统总是以像素为计量单位的,它们是屏幕上实有的物理存在。

由于屏幕上的像素数目是可变的,程序员有时不想使用MM_TEXT坐标系统,而想使用一种更稳定的计量单位,为此,Windows提供了几种逻辑坐标系统。

Windows逻辑坐标系统不使用像素,而以英寸、厘米和缇来计量屏幕。缇是用来计量字体的单位。1 = 1/ 20 1 =  1/72英寸,1 = 1/20 * 1/72 = 1/1440英寸。

 

3映像模式的设置

通过修改映射模式和显示原点,可以改变坐标系统。Windows应用程序可通过调用SetMapMode函数来设定映射模式,通过调用SetViewPortOrg函数,可以把坐标系统原点移到任何位置。默认的映射模式MM_TEXT,即默认的坐标系统。当前设备描述表的映射方式可通过调用GetMapMode函数得到。

SetMapMode函数   

int SetMapMode(HDC hdc,int nMapMode);

说明:参数nMapMode是映射模式。映射共有8种映射模式,取值及含义如下

GetMapMode函数

DWORD GetMapMode (HDC hDC)

映像模式

含义

MM_ANISOTROPIC

逻辑单位被映射成任意的物理单位,   X轴和Y轴成任意比例

MM_HIENGLISH

一个逻辑单位被映射成 0.001 英寸      X向右,正Y向上

MM_HIMETRIC

一个逻辑单位被映射成 0.01 英寸       X向右,正Y向上

MM_ISOTROPIC

逻辑单位被映射成任意的物理单位,X轴和Y轴的变换变换比例相同

MM_LOENGLISH

一个逻辑单位被映射成 0.01 英寸       X向右,正Y向上

MM_LOMETRIC

一个逻辑单位被映射成 0.1 毫米        X向右,正Y向上

MM_TEXT

一个逻辑单位被映射成一个设备像素,  X向右,Y向下

MM_TWIPS

一个逻辑单位被映射成打印机点的1/20,正X向右,正Y向上

 

4.设置设备坐标系统原点

Windows坐标原点可以在屏幕上任意地方移动。使用SetViewportOrg函数。

SetViewPortOrg函数

DWORD SetViewPortOrg(HDC hDC,int x,int y)

下列一组命令把原点移到屏幕中心。

    GetClientRect(hwnd, &Rect);

    SetViewportOrg(PaintDC, Rect.right/2, Rect.bottom/2);

  设置逻辑坐标系统原点

SetWindowOrg函数

DWORD SetViewPortOrg(HDC hDC,int x,int y)

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值