全要

来源:互联网 发布:天龙八部 连接数据库 编辑:程序博客网 时间:2024/04/28 18:07

GetFocus

 

 

返回有输入焦点的窗口,键盘输入发送给这个窗口,整个系统只有一个窗口有输入焦点.

 

GetActiveWindow()是活动窗口,不一定有输入焦点,而且每个线程就有一个活动窗口。

 

GetFocus()   得到的肯定是   ActiveWindow,但是GetActiveWindow()的窗口不一定是有输入焦点的窗口。

 

返回值:
如果活动并且无窗口的控件具有当前的键盘焦点(由控件的包容器判定),那么返回该控件;如果它不具有键盘焦点,则返回NULL
否则返回具有键盘焦点的CWnd对象(同CWnd::GetFocus)。

说明:
调用该函数判定一个COleControl对象是否具有键盘焦点。当调用SetFocus时,一个活动的无窗口控件获得键盘焦点。

 

 

我在改一个程序,动态修改一个对话框界面上元素的位置,自然Tab   Order的顺序也要做动态改动,我就要用GetFocus()来判断当前焦点的位置,可是我发现焦点在编辑框和按钮上时没有问题,一旦焦点在 CCombox框上,GetFocus()的返回就有问题,用 UINT   nCurrentItem   =   GetFocus()->GetDlgCtrlID();返回的值始终是1001,我的界面上有两个CCombox,两个的返回值都是1001,实际上一个是113,一个是 114GetFocus()的返回是什么TmpWnd,实在是搞不懂?

可以提供什么线索吗?或者有什么办法在程序里动态调整Tab   Order

 

我设断点跟了一把
CWnd*   pWnd   =   GetFocus();
CWnd*   pWnd1   =   GetDlgItem(IDC_COMBO_CLIENT);

GetDlgItem(IDC_COMBO_CLIENT)-> SetFocus();
pWnd   =   GetFocus();
最后的pWnd返回竟然和pWnd1不相同
其中,pWnd是什么   CTempWnd  hWnd=0x000f0566
pWnd1  
CCombox  hWnd=0x001803ac

 

 

 

 

A   combo   box   consists  of   a   list   box   combined   with  either   a   static   control   or   edit  control.

GetFocus
返回的是combo  box中的EditCWnd指针。
修改你的程序的最后一句,
pWnd   =   GetFocus()-> GetParent();
你就会发现pWndpWnd1相同了。

另外,
UINT   nCurrentItem   =   GetFocus()-> GetParent()->GetDlgCtrlID()

这一句可以得到combo  boxID

 

请问怎么给对话框中的某个edit控件设置焦点,我用setfocus怎么不行,dialog中的成员函数GoToDlgCtrl也不行,请问怎么搞?

 

SetFocus()函数的正确使用
如果在InitDialog中调用此函数将不能实现预期的功能,比如,在一个登录的对话框实现

如下功能:如果读取的用户名不为空,就设置用于输入口令的控件为当前控件,使用如下

语句在InitDialog中时会没有任何作用
GetDlgItemText(IDC_WL_USERNAME,strName);
if(strName!= " ")
GetDlgItem(IDC_WL_IPASSWORD)-> SetFocus();
原因分析:在创建对话框时,对话框并没有显示出来,而此时调用此函数返回的句柄是

NULL
解决方法:把这段语句放到重载的函数OnShowWindow

 

 

HitText

通过位置得到该项的索引

void CBizmeetDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult) 
{
    //取得鼠标的位置
    CPoint pt;
    GetCursorPos( &pt); 
    m_listCtrl.ScreenToClient(&pt);
    
    int iIndex = m_listCtrl.HitTest(pt,NULL);
    if(-1 != iIndex )
    {
        CString strMess ;
        strMess.Format("你选中第%d",iIndex);
        AfxMessageBox(strMess);
    }
    
    *pResult = 0;
}

 

 

其实关键是要有ScreenToClient这个函数的使用,我先前没有用这个函数,HitTest老是返回-1,搞得我都头大了。不过这个不能用于SubItem,那应该要用SubItemHitTest

LVHITTESTINFO ht ;
    GetCursorPos(&(ht.pt)) ;
    m_friendList.ScreenToClient(&ht.pt) ;

    m_friendList.HitTest(&ht) ;
    
if(ht.iItem == -1)
 //检查是否有item选中
     return  ;

 

 

CListCtrl::HitTest

int HitTest(LVHITTESTINFO* pHitTestInfo) const
int HitTest(CPoint pt,UINT* pFlags=NULL) const

返回值:
返回参数pHitTestInfo指定位置的项的索引,否则为-1

参数:

pHitTestInfo

含有要进行击中测试的位置以及接受击中测试有关结果信息的LVHITTESTINFO结构的地址。

pt

被测试的指针。

pFlags

指向接受测试结果信息的整数的指针。请参阅联机文档平台SDK”中有关LVHITTESTINFO结构的flags成员的注解。


说明:
如果有,则决定哪一个列表视图项在指定的位置上。
可以通过使用结构中flags成员的LVHT_ABOVE,LVHT_BELOW,LVHT_TOLEFT以及LVHT_TORIGHT的值来决定是否滚动列表视图控件的内容。上述两种标志可以自由组合,例如,假设其位于客户区域的左上角。
可以通过测试结构中flags成员的LVHT_ONITEM值来决定是否给定的位置位于列表视图项的上方。该数值通过结构flags成员中的 LVHT_ONITEMICONLVHT_ONITEMLABEL,LVHT_ONITEMSTATEICON的值的位或运算而获取。

 

 

ScreenToClient

  函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。

  函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint)

  参数:

  hWnd:指向窗口的句柄,此窗口的用户空间将被用来转换。

  lpPoint:指向POINT结构指针,该结构含有要转换的屏幕坐标。

  返回值:如果函数调用成功,返回值为非零值,否则为零。

  Windows NT:若想获得更多错误信息,请调用GetLastError函数。

  注释:该函数应用hWnd参数标识的窗口和POINT结构给定的屏幕坐标来计算用户坐标,然后以用户坐标来替代屏幕坐标,新坐标是相对于指定窗口的领域的左上角。

 

先调用GetWindowRect后再调用ScreenToClient,这个时候得到的rect和直接使用GetClientRect得到的值是相等的。有时候需要获得窗口矩形的大小和客户区矩形的大小二者的值,故需要分别调用GetWindowRectGetClientRect。如果只需要获得客户区矩形的大小,调用GetClientRect就行了。GetWindowRectGetClientRect函数的说明如下:

CWnd::GetClientRect  
    void GetClientRect( LPRECT lpRect ) const;
Parameters:
lpRect
    Points to a RECT structure or a CRect object to receivethe client coordinates. The left and top members will be 0. The right andbottom members will contain the width and height of the window.
Remarks:
    Copies the client coordinates of the CWnd client area intothe structure pointed to by lpRect. The client coordinates specify theupper-left and lower-right corners of the client area. Since client coordinatesare relative to the upper-left corners of the CWnd client area, the coordinatesof the upper-left corner are (0,0).

CWnd::GetWindowRect
void GetWindowRect( LPRECT lpRect ) const;
Parameters:
lpRect
Points to a CRect object or a RECT structure that will receive the screen coordinatesof the upper-left and lower-right corners.
Remarks:
Copies the dimensions of the bounding rectangle of the CWnd object to thestructure pointed to by lpRect. The dimensions are given in screen coordinatesrelative to the upper-left corner of the display screen. The dimensions of thecaption, border, and scroll bars, if present, are included.

GetWindowRect() 得到的是在屏幕坐标系下的RECT;(即以屏幕左上角为原点
GetClientRect()
得到的是在客户区坐标系下的RECT 即以所在窗口左上角为原点

GetWindowRect()
取的是整个窗口的矩形;
GetClientRect()
取的仅是客户区的矩形,也就是说不包括标题栏,外框等;

第一个函数获得的是窗口在屏幕上的位置,得到的结果可能是这样CRect(10,10,240,240);
第二个函数和它不同,它只获得了客户区的大小,因此得到的结果总是这样CRect(0,0,width,height);

ScreenToClient() 就是把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。

 

The GetClientRect function retrieves thecoordinates of a window's client area. The client coordinates specify theupper-left and lower-right corners of the client area. Because clientcoordinates are relative to the upper-left corner of a window's client area,the coordinates of the upper-left corner are (0,0).

GetClientRect得到的是客户区的大小,也就是说这样得到的左上角永远是(00

The GetWindowRect function retrieves thedimensions of the bounding rectangle of the specified window. The dimensionsare given in screen coordinates that are relative to the upper-left corner ofthe screen.

GetWindowRect 是窗口相对于整个屏幕的坐标,屏幕左上点为00

相互转化用ScreenToClient 或者 ClientToScreen

ClientToScreen
The ClientToScreen function converts the client coordinates of a specifiedpoint to screen coordinates.
BOOL ClientToScreen(
   HWNDhWnd,        // window handle for sourcecoordinates
   LPPOINT lpPoint   //pointer to structure containing screen coordinates
);

Parameters
hWnd
Handle to the window whose client area is used for the conversion.
lpPoint
Pointer to a POINT structure that contains the client coordinates to beconverted. The new screen coordinates are copied into this structure if thefunction succeeds.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
虽然存在调用GetWindowRect后再调用ScreenToClient==GetClientRect,但ScreenToClient()和ClientToScreen()两者都是属于WINDOWS API函数,可能是存在一定的冗余设计,但意义不同。
不过在.Net Framework下对WINDOWS API函数进行了重新整理和优化,在获取控件或窗口的屏幕坐标和客户区坐标时更方便的多,只需要得到与控件或窗口相对应屏幕坐标和客户区坐标属性值就可以了

ScreenToClient
The ScreenToClient function converts the screen coordinates of a specifiedpoint on the screen to client coordinates.
BOOL ScreenToClient(
   HWNDhWnd,         // window handle forsource coordinates
   LPPOINTlpPoint    // address of structure containing coordinates
);
Parameters

hWnd
Handle to the window whose client area will be used for the conversion.
lpPoint
Pointer to a POINT structure that contains the screen coordinates to beconverted.
Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.

例如:右下角坐标等于左上角坐标加上窗口的尺寸  
   
  CRect   rt;  
  GetWindowRect(&rt);  
  CPoint   pt;  
  pt   =   rt.BottomRight();  

 

我的总结:

如果需要获得窗体在屏幕上的位置,使用GetWindowRect

如果需要获得窗体的大小,使用GetClientRect

 

 

原创  CHeaderCtrl 收藏

CListCtrlLVS_REPORT模式时,就需要用到CHeaderCtrl 取得CHeaderCtrl指针:               方法一:

  CListCtrl*pListCtrl = (CListCtrl*)GetListCtrl();                   CHeaderCtrl *pHeaderCtrl =  pListCtrl->GetHeaderCtrl(); ASSERT(pHeaderCtrl);                    方法二:

 CWnd *pWnd =pListCtrl->GetDlgItem(0); //注:CListCtrl分配给CHeaderCtrlControl ID一直都是0                    ASSERT(pWnd);                                          CHeaderCtrl *pHeaderCtrl =static_cast(pWnd);                   ASSERT(pHeaderCtrl);

自定义标头项的外观通过在首次创建标头控件 (CHeaderCtrl::Create) 时设置 dwStyle 参数,可以定义标头项或标头控件本身的外观和行为。以下是可以设置的样式的取样及其用途:                           •若要使标头项看上去像一个普通按钮,请使用 HDS_BUTTONS 样式。如果要采取操作以响应标头项上的鼠标单击(如按照特定的列对数据进行排序,像在 Microsoft Outlook 中那样),请使用此样式。若要在鼠标光标经过标头项时给予标头项热跟踪的外观,请使用 HDS_HOTTRACK 样式。当指针经过本来是平面的栏中的项时,热跟踪显示三维轮廓。若要指示应隐藏标头控件,请使用 HDS_HIDDEN 样式。 HDS_HIDDEN 样式指示标头控件用作数据容器而不是可视控件。此样式不自动隐藏控件,但却影响 CHeaderCtrl::Layout 的行为。WINDOWPOS 结构的 cy 成员中返回的值将是零,表示不应该让用户看到此控件。

表头控制(CHeaderCtrl)通常应用在窗口中的文本或数据的列表之上。一般为数据列的标题,可以包括多个部分,用户可以拖动每个部分并可以控制每列的宽度。表头控制类提供了普通表头控制的基本方法,只有在WINDOWS95以后版本系统中才提供,其方法包含在afxcmn.h文件中,一般与标签控 制(CTabCtrl)和列表控制(CListCtrl)组合使用。
1.1
表头控制的对象结构
1.1.1
表头控制对象的建立方法
CHeaderCtrl &cheaderCtrl
建立表头控制对象
Create
建立表头并绑定对象
CHeaderCtrl::Create
的格式如下:BOOL Create( DWORD dwStyle, const RECT&
rect, CWnd* pParentWnd, UINT nID );
其返回值非零时初始化成功,否则失败。
参数dwStyle用来确定表头控制类型;rect用来确定表头控制的大小和位置;ParentWnd用来确定表头控制的父窗口;nID用来表示表头控制的标志。
表头控制风格包括:
HDS_BUTTONS
表示表头控制外观类似按钮;
HDS_HORZ
表示表头控制为水平排列;
HDS_VERT
表示表头控制为垂直排列;
HDS_HIDDEN
表示表头控制为隐藏模式。
它也可以使用普通类控制风格,包括:
CCS_BOTTOM
设置控制位置在父窗口的底部并与父窗口同样宽度;
CCS_NODIVIDER
在控制顶部形成两个像素的高亮区;
CCS_NOHILITE
在控制顶部形成一个像素的高亮区;
CCS_NOMOVEY
在响应WM_SIZE消息时重置大小并水平排列;
CCS_NOPARENTALIGN
使控制自动靠近父窗口的顶部或底部;
CCS_NORESIZE
设置初始大小或新值时使控制使用默认宽度和高度;
CCS_TOP
设置在父窗口客户区域的顶部并与父窗口同样宽度;
同样表头控制也可以使用窗口控制风格,包括:
WS_CHILD
建立一个子窗口,不能用于WS_POPUP窗口类型;
WS_VISIBLE
建立一个初始时不可见的窗口;
WS_DISABLED
建立一个初始时无效的窗口;
WS_GROUP
确定可用光标移动的控制群组;
WS_TABSTOP
确定可用TAB控制移动站点;
表头控制一般分为两个步骤,首先确定表头控制的数据结构,然后建立表头控制并绑定对象。
1.1.2
表头控制的属性
表头控制的属性包括取得表头控制中项目的数量GetItemCount、取得表头控制中某一项目的内容GetItem和设置表头控制中某一项目的内容SetItem
1.1.3
表头控制的操作方法
表头控制的操作方法包括向表头控制中插入一个新项目InsertItem、从表头控制中删除一个项目DeleteItem和绘制表头中给定的项目DrawItem等。
1.2
表头控制的数据结构
在使用表头控制时,首先必须建立一个数据结构HD_ITEM,其结构定义如下:
typedef struct _HD_ITEM
{ UINT mask; //
结构成员有效控制位
int cxy; //
表头项目的宽度
LPSTR pszText; //
表头项目内容
HBITMAP hbm; //
表头项目的位置句柄
int cchTextMax; //
表头内容字符串长度
int fmt; //
表头项目的格式
LPARAM lParam; //
应用程序定义的32位数据
} HD_ITEM;
屏蔽控制位说明了数据结构成员中包含的有效数据,可以是下面标志的组合:
HDI_BITMAP hbm
成员有效
HDI_FORMAT fmt
成员有效
HDI_LPARAM lParam
成员有效
HDI_TEXT pszText
cchTextMax 成员有效
HDI_WIDTH cxy
成员有效并确定项目宽度值
格式标志位fmt可以是以下标志的组合:
HDF_CENTER
表头项目居中
HDF_LEFT
表头项目左对齐
HDF_RIGHT
表头项目右对齐
HDF_BITMAP
表头显示一个位图
HDF_OWNERDRAW
由主窗口自绘表头项目
HDF_STRING
表头项目为一个字符串
1.3
表头控制的应用技巧
于表头控制无法单独使用,其主要是配合列表控制和标签控制,并多以文字表头应用多见,InsertItemSetItemGetItem是常用的方 法,如在列表控制时利用InsertColumn属性就可以增加一个表列的文本标题,具体用法和技巧见列表控制和标签控制。下面以在列表控制中的增加表列 的方法来具体说明:
lvcol.pszText=
;//设置第一列名
lvcol.iSubItem=i; //
表列宽
m_ListCtrl.InsertColumn(i++,&lvcol);//
插入一列
lvcol.pszText=
;//第二列名
lvcol.iSubItem=i;
lvcol.cx=70;
m_ListCtrl.InsertColumn(i++,&lvcol);//
插入一列

GetHeaderCtrl():

CListCtrl控件上边那一排Column

 

 

CListCtrl::GetItemRect

BOOL GetItemRect(int nItem,LPRECT lpRect,UNIT nCode) const

返回值:如果成功,则返回非零值,否则为0

参数:

nItem

要获取位置的项的索引值。

lpRect

接受绑定矩形的RECT结构的地址。

nCode

要获取绑定矩形的列表视图项的部分。它可为下列值之一:

·

LVIR_BOUNDS

返回整个项的绑定矩形,包括图标和标签。

·

LVIR_ICON

返回图标或小图标的绑定矩形。

·

LVIR_LABEL

返回项文本的绑定矩形。

 


说明:
在当前视图中获取某项的全部或部分的绑定矩形。

 

 

CHeaderCtrl::GetItemRect

BOOL GetItemRect(int nIndex, LPRECT lpRect) const;

返回值:如果成功,则返回非零值,否则为0

参数:

nIndex

标头控件项目基于0的索引。

lpRect

指向RECT项目地址的指针,以接收有界矩形的更多信息。


说明:
此函数实现Win32消息HDM_GETITEMRECT的功能,可参阅联机文档平台SDK”

CListCtrl::GetItemPosition

BOOL   GetItemPosition(int   nItem,LPPOINT  lpPoint)   const

返回值:如果成功,则返回非零值,否则为0

参数:   nItem   要获取位置的项的索引值。    
lpPoint  
在视图坐标中接受项左上角位置POINT结构的地址,按视图坐标。    

说明:获取列表视图项的位置。
//////////////////////////////////////////////////////////////
CListCtrl::GetItemRect

BOOL   GetItemRect(int   nItem,LPRECT  lpRect,UNIT   nCode)   const

返回值:如果成功,则返回非零值,否则为0

参数:   nItem   要获取位置的项的索引值。    
lpRect  
接受绑定矩形的RECT结构的地址。    
nCode  
要获取绑定矩形的列表视图项的部分。它可为下列值之一:  ·   LVIR_BOUNDS   返回整个项的绑定矩形,包括图标和标签。    
·   LVIR_ICON  
返回图标或小图标的绑定矩形。    
·   LVIR_LABEL  
返回项文本的绑定矩形。    

说明:
在当前视图中获取某项的全部或部分的绑定矩形。

 

 

先看看执行是否成功,如果成功再看看值是屏幕坐标还是窗口坐标,需要的话自已转一下.

 

列表视图控件(List Control
列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来。与树视图类似,列表控件可以由多个子项目组成,并且支持大图标、小图标、列表和报表4种方式显示信息,如图1所示。
1 列表视图的4种显示方式
列 表视图包含一个项目列表,而其中每个项目由图标、项目名称和多个子项组成,每一个子项所包含的项目的数目必须相同,属性相同的每个子项显示在同一个列中。列表视图控件有两个重要的数据结构LVCOLUMNLVITEMLVCOLUMN用于定义报表方式下的的结构;LVITEM用于定义的结构。这两个结构的定义及说明如下:

typedef struct _LVCOLUMN {
UINT mask;            //
说明此结构中哪些成员是有效的
int fmt;           //
列的对齐方式
int cx;            //
列的初始宽度
LPTSTR pszText; //
列的标题
int cchTextMax;   //pszText
所指向的缓冲区的大小
int iSubItem;      //
与列关联的子项的索引值,从0开始
int iImage;           //
与列关联的图像列表中指定图像的索引值
int iOrder;           //
第几列,0代表最左一列
} LVCOLUMN, FAR *LPLVCOLUMN;
typedef struct _LVITEM {
UINT   mask;        //
说明LVITEM结构中哪些成员有效
int    iItem;       //
项目的索引值(可以视为行号)0开始
int    iSubItem;    //
子项的索引值(可以视为列号)0开始
UINT   state;       //
子项的状态
UINT   stateMask;   //
状态有效的屏蔽位
LPTSTR pszText;   //
主项或子项的名称
int    cchTextMax; //pszText
所指向的缓冲区大小
int    iImage;       //
关联图像列表中指定图像的索引值
LPARAM lParam;    //
程序定义的32位参数
int iIndent;          //
表示图像位置缩进的单位
} LVITEM, FAR *LPLVITEM;

列表项常用的属性如下:View指定程序运行后列表视图控件最初显示的方式,可以设置为Icon(大图标)、SmallIcon(小图标)、List(列 表)或Report(报表);Single selection表示每次只能选中一个项;Auto arrange使得项目在IconSmall Icon显示方式下能够自动排序;Edit Labels表示可以编辑项目的卷标;No column header表示取消控件所有列的标题。

 

GetTextExtent

  函数功能:使用该函数获得所选字体中指定字符串的高度和宽度

  函数原型:CSize GetTextExtent(LPCTSTR lpszString, intnCount)

  参数:

  lpszString是字符串的指针

  nCount是所包括的字符数

  返回值CSize是包含(cxcy2个成员的结构,cx是字符串的宽度,cy是字符串的高度。

 

CComboBox::SetItemHeight

int SetItemHeight( int nIndex, UINT cyItemHeight );

返回值:
如果下标或高度值无效,则返回CB_ERR。否则为0

参数:

nIndex

指明要设置的是组合框中列表项的高度还是编辑控件(或静态文本)的高度。
如果组合框的风格是CBS_OWNERDRAWVARIABLEnIndex指定了列表中待设置高度的项的下标。否则nIndex必须为0,而且要设置的是所有列表项的高度(它们的高度相同)。
如果nIndex-1,则将设置组合框中编辑控件或者静态文本的高度。

cyItemHeight

指定待设置对象的高度(以像素为单位)。

 

原创粉丝点击