CWnd::GetWindowRect
void GetWindowRect(LPRECT lpRect) const;
CRect rect;
GetWindowRect(&rect);
GetDlgItem(IDC_****)->GetWindowRect(&rect);
23、设置一个窗口的大小 CWnd::SetWiondowPos
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
z次序 改变后的坐标 宽高 改变类型
改变类型:SWP_NOMOVE 保留当前位置不移动,会把x,y忽略掉
SWP_NOZORDER 保留当前的z顺序,会把第一个参数忽略掉
SetWindowPos(NULL,0,0,rectsmall.Width(),rectsmall.Height(),SWP_NOMOVE|SWP_NOZORDER);
SetWindowPos(NULL,0,0,rectlarge.Width(),rectlarge.Height(),SWP_NOMOVE|SWP_NOZORDER);
设置了rect的四个点后,直接用rect的width()\\height()即可获取宽高
设置WS_EX_TOPMOST风格创建最顶层窗口
BringWindowToTop() 把一个窗口放置在z次序的顶部 SetWindowPos()和DeferWindowPos()可以重排z次序
兄弟窗口:共享同一个父窗口的多个子窗口叫兄弟窗口。
活动窗口:活动窗口是应用程序的顶层窗口,也就是当前使用的窗口。只有一个顶层窗口可以是活动窗口,如果用户使用的是一个子窗口,Windows系统就激活与这个子窗口相应的顶层窗口。
任何时候系统中只能有一个顶层窗口是活动的。用户通过单击窗口(或其中的一个子窗口)、使用ALT+TAB或ALT+ESC组合键来激活一个顶层窗口,应用程序则调用函数SetActiveWindow来激活一个顶层窗口。
前台窗口和后台窗口:在Windows系统中,每一个进程可运行多个线程,每个线程都能创建窗口。创建正在使用窗口的线程称之为前台线程,这个窗口就称之为前台窗口。所有其它的线程都是后台线程,由后台线程所创建的窗口叫后台窗口。
用户通过单击一个窗口、使用ALT+TAB或ALT+ESC组合键来设置前台窗口,应用程序则用函数SetForegroundWindow设置前台窗口。如果新的前台窗口是一个顶层窗口,那么Windows系统就激活它,换句话说,Windows系统激活相应的顶层窗口。
24、改变窗口过程,这个太有用了
LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong); //sdk函数,改变指
定窗口的属性
要改变的窗口的句柄 你要改变的属性 新的值
通过设置改变的属性为GWL_WNDPROC,并给出一个新的窗口过程,可以改变默认的窗口过程
返回的先前的指定的32位的整型值,也就是,如果改变的是窗口过程,则返回原先的窗口过程地址
窗口内的控件是在OnCreate()之后,OnInitDialog()之前创建的,对控件操作,应在OnInitDialog()中
sdk平台的焦点设置函数,可以不通过cwnd对象的SetFocus()函数设置窗口焦点 HWND SetFocus(HWND hWnd); //参数为你要设置的窗口的句柄
sdk平台的获取当前窗口的下一个窗口句柄
HWND GetNextWindow(HWND hWnd,UINT wCmd); //当前焦点窗口的句柄,移动方向 //GWL_HWNDNEXT向下,GWL_HWNDPREV向上
有cwnd的获取当前窗口的下一个窗口句柄函数
CWnd* GetNextWindow(UINT nFlag=GW_HWNDNEXT)const; //默认获取下一个
editBox控件默认属性不接受多行,要把stylec-Multiline勾上才能接受按键消息
sdk平台获取窗口句柄的另一个函数
HWND GetWindow(HWND hWnd,UINT wCmd); //开始查找的窗口句柄,查找方向、位置
//GW_HWNDNEXT下一个 有cwnd的获取窗口句柄的另一个函数 CWnd::GetWindow
CWnd* GetWindow(UINT nCmd)const; //参数为查找方向标志
查找具有tab stop属性的控件函数,按照tab顺序查找
HWND GetNextDlgTabItem(HWND hDlg,HWND hCtl,BOOL hPrevious);
所在对话框即父窗口 从哪个控件开始查找 方向标记,TRUE前,FALSE下一个 CWnd::GetNextDlgTabItem(CWnd* pWndCtl,BOOL hPrevious=FALSE)const; 开始控件 查找方向
删了窗口中的ok按钮,但窗口仍然可以响应ok函数,手动建立一个ok按钮只需要把id改为idok
void CTestDlg::OnOK() {
//GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();//老是从第一个编辑框开始
//GetFocus()->GetNextWindow()->SetFocus(); //先获取当前焦点,下个完了会传回空指针错误 //GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus(); //同样会出现空指针错误
GetNextDlgTabItem(GetFocus())->SetFocus(); //从焦点控件开始,避免了空指针错误 //CDialog::OnOK(); }
WNDPROC prevProc; //自定义的窗口过程 LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window UINT uMsg, // message identifier
WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) {
if(uMsg==WM_CHAR && wParam==0x0d) {
//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));//调用sdk函数 //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));
SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE)); return 1; } else {
return prevProc(hwnd,uMsg,wParam,lParam); } }
BOOL CTestDlg::OnInitDialog() {
CDialog::OnInitDialog();
prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,
(LONG)WinSunProc); //改变IDC_EDIT1的窗口过程为自定义窗口过程,保存原先窗口过程
return TRUE; }