八:客户区域窗体的坐标位置定位

一,GetWindowRect(&rtCurMain);//获取窗口客户区域S

     +  rtCurMain {top=223 bottom=761 left=213 right=1068} CRect

      (Left,Top)和(Right,Bottom)分别为窗口客户区域的左上角坐标及右下角坐标

      Width为窗口客户区域的宽度,Height为窗口客户区域的高度

     int nW = rtCurMain.Width();//=right-left=855
     int nH = rtCurMain.Height();//=Bottom-Height=538

     

 

二, point.x=LOWORD(pMsg->lParam);//地位------鼠标点击的位置的客户区窗体相对于左上角的X坐标
       point.y=HIWORD(pMsg->lParam);//高位------鼠标点击的位置的客户区窗体相对于左上角的Y坐标

 

三, GetClientRect(&rtCurMain)  

       获取的是窗口客户区域的大小,而不是左上角和右下角坐标

       +  rtCurMain {top=0 bottom=538 left=0 right=855} CRect 

       与GetWindowRect相互转化用 ScreenToClient  或者  ClientToScreen

四, if (PtInRect(&rtDrag,point))//

       判断点point的位置是否在巨型rtDrag之内 如果 rect.left<=point.x<rect.right 且 rect.top<=point.y<rect.bottom 则认为point在rect之内

 

例如:

CPoint   point; 
 
  CRect rtCurMain(0,0,0,0);

  GetWindowRect(&rtCurMain);//获取鼠标点击屏幕的坐标
int nW = rtCurMain.Width();
  int nH = rtCurMain.Height();
  point.x=LOWORD(pMsg->lParam);//窗体的坐标位置
point.y=HIWORD(pMsg->lParam);//窗体的坐标位置
CRect rtDrag(0,0,nW-50,20); //右边几个按钮的宽度,黑色标题栏的高度
  if (PtInRect(&rtDrag,point))//如果 rect.left<=point.x<rect.right 且 rect.top<=point.y<rect.bottom 则认为point在rect之内
  {
   //非标题栏移动整个窗口
   ::SendMessage(this->GetParent()->GetSafeHwnd(),WM_SYSCOMMAND,0xF012,0);
   ::PostMessage(this->GetParent()->GetSafeHwnd(),WM_LBUTTONUP,NULL,MAKELPARAM(point.x,point.y));
  }

五,用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);
void MoveWindow(LPCRECT lpRect);
第一种用法需给出控件新的坐标和宽度、高度;
第二种用法给出存放位置的CRect对象;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针,IDC_EDIT1为控件ID号
pWnd->MoveWindow( CRect(0,0,100,100) );    //在窗口左上角显示一个宽100、高100的编辑控件

SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一个参数我不会用,一般设为NULL;
x、y控件位置;cx、cy控件宽度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一个参数;
SWP_NOMOVE:忽略x、y,维持位置不变;
SWP_NOSIZE:忽略cx、cy,维持大小不变;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_BUTTON1 );    //获取控件指针,IDC_BUTTON1为控件ID号
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把按钮移到窗口的(50,80)处
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把编辑控件的大小设为(100,80),位置不变
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );    //编辑控件的大小和位置都改变
以上方法也适用于各种窗口。

 

六,GetWindowLong() SetWindowLong() 详解

这两个函数在windows程序中有着重要的作用,依照MSDN说明以下这两个函数。

/*****************************************************************/

GetWindowLong

这个函数可以通过一个窗口的句柄来得到窗口的一些其他的信息,比如ID等

语法:

LONG GetWindowLong( HWND hwnd,int nIndex);

·hwnd 是要查询的窗口的句柄

·nIndex 有几个标识符来让我们得到不同的信息:

GWL_EXSTYLE extended windows styles

GWL_STYLE   返回windows创建时的style

GWL_WNDPROC 返回windows 的消息处理函数的地址

GWL_HINSTANCE 返回应用程序的实例句柄

GWL_ID 返回窗口的ID

GWL_HWNDPARENT 返回这个窗口的父窗口句柄

GWL_USERDATA 返回和这个窗口相关联的用户数据

如果hwnd是一个对话框句柄,就可以使用下面几个标志:

DWL_DLGPROC 同样是消息处理函数的地址

DWL_MESRESULT 返回消息处理函数中的消息(????)

DWL_USER 一些附加的内容

·返回值

     如果函数调用成功,就会返回一个所要查询的32-bit的值

     如果不成功,就会返回0.

比如我们想要获得一个窗口的id,可以这样用

Id = GetWindowLong(hwnd,GWL_ID);

/**********************************************************/

SetWindowLong

该函数与GetWindowLong相仿,不过就是由获取信息变成了改变信息,我们可以通过这个函数来设定窗口的一些字段和属性。

语法

LONG SetWindowLong( HWND hwnd, int nIndex,   LONG dwNewLong );

·hwnd 就是窗口的句柄

· nIndex 这个字段的标志和GetWindowLong是一样的,可以通用

·dwNewLong 是我们需要设定的那个值,要用它对窗口进行修改。

返回值:

当函数调用成功时,函数返回被修改的那个值。

如果不成功,函数返回0。

举个简单的例子,如果说我们想把主窗口的消息处理函数改为WndProcChanged(HWND,UINT,WPARAM,LPARAM);

我们可以这样写:

   SetWindowLong(hwnd, GWL_WNDPROC, (LONG)WndProcChanged);

这样,窗口的消息处理函数就成了我们刚刚声明的那个函数。其他的标志符都可以这样用。

 

七,设置透明窗口
 DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
 if((dwExStyle&0x80000)!=0x80000)
  SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);

八,使得窗口跟随鼠标一起拖动

void CGDIPClockDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 //禁止显示移动矩形窗体框
 //::SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,TRUE,NULL,0);
 //非标题栏移动整个窗口
 //SendMessage(WM_SYSCOMMAND,0xF012,0);  
 PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));  
 CDialog::OnLButtonDown(nFlags, point);
}

九,去除任务栏窗口对应按钮
 ModifyStyleEx (WS_EX_APPWINDOW,WS_EX_TOOLWINDOW );

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值