mfc的position_MFC一些函数区别

GetMessagePos GetCursorPos的区别

The GetMessagePos function retrieves the cursor position for the last message retrieved by the GetMessage function.

The GetCursorPos function retrieves the cursor's position, in screen coordinates.

可以看出上面的明显不同,就是GetMessagePos 的鼠标位置是从消息队列当中拿的,而GetCursorPos是直接取的。

LOWORD, HIWORD 与 GET_X_PARAM, GET_Y_PARAM 的区别

LOWORD, HIWORD 与 GET_X_PARAM, GET_Y_PARAM 的区别

今天写一个拖放功能时,遇到了很奇怪的问题.  拖放只能拖放到原始窗口的正方向,即右下. 而往左上拖放始终不行,思量再三,发现是自己使用的HIWORD, LOWORD 的问题.

#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))

#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))

typedef unsigned short WORD ;

一看便知, LOWORD , HIWORD 存在着丢失负值的现象.

#define GET_X_LPARAM(lp)                        ((int)(short)LOWORD(lp))

#define GET_Y_LPARAM(lp)                        ((int)(short)HIWORD(lp))

这两个宏在使用HIWORD, LOWORD 的同时, 进行了数值类型转换,重而保证了数值的正确.

得出的教训是: 处理诸如WM_LBUTTONDOWN , WM_LBUTTONUP 这类消息时, 切忌不要使用LOWORD, HIWORD 这种宏,

鼠标的位置是可正可负的.

Cardinal 是 4 字节无符号的整型, 先看一个例数:

Cardinal 例数:

4277991664

按字节划分:

第四字节

第三字节

第二字节

第一字节

二进制:

11111110

11111100

11111000

11110000

十六进制:

FE

FC

F8

F0

十进制:

254

252

248

240

按双字节划分:

高两位

低两位

二进制:

1111111011111100

1111100011110000

十六进制:

FEFC

F8F0

十进制:

65276

63728

//可以用 Lo 函数提取它的低字节(也就是第一个字节)const

c: Cardinal = 4277991664;

begin

ShowMessageFmt('%d', [Lo(c)]); {240}

end;

//其实不使用 Lo 函数, 通过 Byte 类型转换也可以获取第一个字节const

c: Cardinal = 4277991664;

begin

ShowMessageFmt('%d', [Byte(c)]); {240}

end;

//Hi 函数说是获取高位字节, 其实是获取第二个字节const

c: Cardinal = 4277991664;

begin

ShowMessageFmt('%d', [Hi(c)]); {248}

end;

//如果要获取低两位, 貌似应该有个 LoWord 函数; 确实有, 但它不是函数, 只是 Word 类型的一个别称.const

c: Cardinal = 4277991664;

begin

ShowMessageFmt('%d', [LoWord(c)]); {63728}

ShowMessageFmt('%d', [Word(c)]); {63728}

end;

//HiWord 函数是提取高两位的const

c: Cardinal = 4277991664;

begin

ShowMessageFmt('%d', [HiWord(c)]); {65276}

end;

说说 LoWord 和 HiWord 的用途:

譬如在一个鼠标消息的消息参数 lParam 中存放着鼠标位置. lParam 是 4 字节的, 它的低两位存放 x、高两位存放 y

pt.X := LoWord(lParam); {lParam 中的低两位是 x 坐标}

pt.Y := HiWord(lParam); {lParam 中的高两位是 y 坐标}

BYTE、WORD与DWORD类型

在Visual C++ 6.0中,BYTE与WORD,DWORD本质上都是一种无符号整型,它们在WINDEF.H中被定义,定义如下:

typedef unsigned char       BYTE;

typedef unsigned short      WORD;

typedef unsigned long       DWORD;

也就是说BYTE是无符号的char型(char型本质上也是一种1个字节的整型),WORD是无符号short型,DWORD是无符号long型。

而在Visual C++ 6.0中,char型长度为1字节,short型长度为2字节,int和long型长度都为4字节,因此可以认为BYTE与WORD,DWORD定义的变量分别获得了1字节,2字节,4字节内存,正与BYTE与WORD,DWORD的字面意义相符。

即:BYTE=unsigned char(完全等同)

WORD=unsigned short(完全等同)

DWORD=unsigned long(完全等同)

GetFirstDocTemplatePosition和GetNextDocTemplate

GetFirstDocTemplatePosition

取出第一个文档模板的位置。

POSITION GetFirstDocTemplatePosition( ) const;

返回值: 一个POSITION值,能被用于克隆或修改对象指针;如果列表是空的则为NULL。

备注:

获得应用程序中的首席文档模板的位置。由调用GetNextDocTemplate返回的 POSITION值来

得到首席CDocTemplate对象。

29、GetNextDocTemplate

取出文档模板位置,能被递归使用。

CWinApp::GetNextDocTemplate

CDocTemplate* GetNextDocTemplate( POSITION& pos ) const;

返回值: 指向CDocTemplate对象的指针。

参数:

pos 前面调用GetNextDocTemplate or GetFirstDocTemplatePosition返回的POSITION值的

索引。该值在这次调用中被更新为下一个位置。

备注:

获得由pos鉴定的文档模板,然后将pos设置为POSITION值。如果你用GetFirstDocTemplat

ePosition来设定最初位置,你可以用GetNextDocTemplate循环向前。

你必须确保你的POSITION值是有效的。如果它无效,则只能用MFC类库的调试版。

如果取出的文档模板是最后一个有效值,则pos的新值被设为NULL。

例子:

POSITION po = AfxGetApp()->m_pDocManager->GetFirstDocTemplatePosition();

((CDocTemplate*)(AfxGetApp()->m_pDocManager->GetNextDocTemplate(po)))->OpenDocumentFile(NULL);//获取第一个documentTemplate

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2010-08-05 13:43

浏览 1455

评论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值