在另一个线程设置CStatic的的宽度,但CStatic的位置居然变了,该如何解决
在另一个线程设置CStatic的的宽度,但CStatic的位置居然变了
下面代码是略微删去了一部分后的
这里想模仿下进度条,但是启动线程以后,CStatic 的位置跑到了窗口左上角。
------解决方案--------------------
pWnd->front.GetClientRect(r);
改成GetWindowRect();
可能用到的坐标转换函数
ScreenToClient();
------解决方案--------------------
一个窗口的客户区坐标,左上坐标当然是0了。
//pWnd->front.GetWindowRect(r);
//pWnd->front.ScreenToClient(r);
pWnd->front.GetClientRect(r);
--------------------
改成
pWnd->front.GetWindowRect(&r);
pWnd->SrceenToClient(&r);
然后再movewindow,这里的front控件应该是个子窗口,movewindow需要的参数是这个子窗口在父窗口上的客户区坐标。
下面代码是略微删去了一部分后的
这里想模仿下进度条,但是启动线程以后,CStatic 的位置跑到了窗口左上角。
- C/C++ code
class CMainWindow : public CFrameWnd { public: DECLARE_MESSAGE_MAP() public: CMainWindow(); CStatic front; HBRUSH hBrushBlue; void click(); HBRUSH OnCtlColor(CDC*pDC, CWnd*pWnd, UINT nCtlColor); }; CMainWindow::CMainWindow() { Create(strClassName,L"",WS_OVERLAPPEDWINDOW); CRect r; r.left = 100; r.top = 200; r.right = r.left; r.bottom = r.top + 20; front.Create(L"", WS_CHILD ,r, this,1); hBrushBlue = ::CreateSolidBrush(RGB(0,0,255)); } UINT ThreadFunc(PVOID p) { CMainWindow * pWnd = (CMainWindow*)p; pWnd->front.ShowWindow(SW_SHOW); CRect r; while( 1 ) { //pWnd->front.GetWindowRect(r); //pWnd->front.ScreenToClient(r); pWnd->front.GetClientRect(r); if( r.Width() <= 500 )//在这行设个断点,发现 r.left 和 r.top 都是 0 r.right++; else break; pWnd->front.MoveWindow(r); ::Sleep(10); } return 0; } void CMainWindow::click()//按钮单击 { CWinThread * pThread = AfxBeginThread(ThreadFunc,this,0,0, CREATE_SUSPENDED); pThread->ResumeThread(); } HBRUSH CMainWindow::OnCtlColor(CDC*pDC, CWnd*pWnd, UINT nCtlColor) { if(pWnd== &front) return hBrushBlue; return CFrameWnd::OnCtlColor(pDC, pWnd, nCtlColor); }
------解决方案--------------------
pWnd->front.GetClientRect(r);
改成GetWindowRect();
可能用到的坐标转换函数
ScreenToClient();
------解决方案--------------------
一个窗口的客户区坐标,左上坐标当然是0了。
//pWnd->front.GetWindowRect(r);
//pWnd->front.ScreenToClient(r);
pWnd->front.GetClientRect(r);
--------------------
改成
pWnd->front.GetWindowRect(&r);
pWnd->SrceenToClient(&r);
然后再movewindow,这里的front控件应该是个子窗口,movewindow需要的参数是这个子窗口在父窗口上的客户区坐标。