NewsView.cpp(1258) : [15EC] OnNcPaint(): rect.left:2, rect.top:20, rect.right:539, rect.bottom:270
NewsView.cpp(1259) : [15EC] OnNcPaint(): rect_window.left:2, rect_window.top:2, rect_window.right:549, rect_window.bottom:270
NewsView.cpp(1271) : [15EC] OnNcPaint(): nTabHeigh:42
NewsView.cpp(1278) : [15EC] OnNcPaint(): bShowVScrollBar: 1, rect.Height: 250, rect.Width: 537
NewsView.cpp(1301) : [15EC] OnNcPaint(): m_bItemOn:0, m_bShowTab:1
NewsView.cpp(2562) : [15EC] SetPosBmpBtn(): Start
NewsView.cpp(2567) : [15EC] SetPosBmpBtn(): rect.left:2, rect.top:20, rect.right:539, rect.bottom:270
NewsView.cpp(2575) : [15EC] SetPosBmpBtn(): End
NewsView.cpp(206) : [15EC] OnDraw(): rect.left:0, rect.top:0, rect.right:537, rect.bottom:250
這些是TRACE輸出,發現onDraw和OnNcPianit取到的客戶區不一樣。
然后bug的現象是視圖的非客戶區一直在描畫,但是一直描畫不成功。求各位大神解救
uj5u.com熱心網友回復:
rect.left:2, rect.top:20, rect.right:539, rect.bottom:270OnDraw(): rect.left:0, rect.top:0, rect.right:537, rect.bottom:250
rect,OffsetRect (-rect.left, -rect.top); // 539-2=537;270-20=250
就一樣了 !
uj5u.com熱心網友回復:
@schlafenhamster 謝謝了,但是試過offset之后還是不行,非客戶區仍然描畫不全。可能原因不是因為OnDraw和OnNcPaint取到的客戶區域不同uj5u.com熱心網友回復:
看看你的代碼 !uj5u.com熱心網友回復:
void CNewsView::OnNcPaint()
{
// TODO: Add your message handler code here
CRect rect,rect_window;
GetClientRect(&rect);
GetWindowRect(&rect_window); // 獲取視窗邊框尺寸
ClientToScreen(&rect);
GetParent()->ScreenToClient(&rect);
GetParent()->ScreenToClient(&rect_window);
TRACE("OnNcPaint(): rect.left:%d, rect.top:%d, rect.right:%d, rect.bottom:%d\n", rect.left, rect.top, rect.right, rect.bottom);
TRACE("OnNcPaint(): rect_window.left:%d, rect_window.top:%d, rect_window.right:%d, rect_window.bottom:%d\n", rect_window.left, rect_window.top, rect_window.right, rect_window.bottom);
// SetPosBmpBtn();
int nRows = m_pNewTab->GetRowCount(); // 獲取當前tab排列行數
int nTabHeigh = 20;
if(nRows > 1 && nRows<m_pNewTab->GetItemCount())
{
CRect tabRc;
m_pNewTab->GetItemRect(0,tabRc); // 取得單個tab的區域
nTabHeigh = nRows*tabRc.Height(); // 設定繪制所有tab區域的高度
}
TRACE("OnNcPaint(): nTabHeigh:%d\n", nTabHeigh);
int nScrollMove = 0;
// nScrollMove= nTabHeigh - rect.top;
/////////////end
if((m_pvScrollBar!=NULL)&&(IsWindow(m_pvScrollBar->m_hWnd)))
{
TRACE("OnNcPaint(): bShowVScrollBar: %d, rect.Height: %d, rect.Width: %d\n", bShowVScrollBar, rect.Height(), rect.Width());
if(rect.Height()>10&&bShowVScrollBar) {
m_pvScrollBar->SetWindowPos(&wndTop,rect.right,rect.top+2,//
10,rect.Height (),SWP_DRAWFRAME|SWP_SHOWWINDOW|SWP_FRAMECHANGED);
}
else//10
m_pvScrollBar->ShowWindow(SW_HIDE);
if(rect.Width()>10&&bShowHScrollBar)
{
m_phScrollBar->SetWindowPos(
&wndTop,rect.left,rect.bottom,
rect.Width ()+10,10,//10
SWP_DRAWFRAME|SWP_SHOWWINDOW|SWP_FRAMECHANGED);
}
else
{
m_phScrollBar->ShowWindow(SW_HIDE);
}
// if(rect.Height()>3)
// {
// if(m_pNewTab->GetSafeHwnd())
TRACE("OnNcPaint(): m_bItemOn:%d, m_bShowTab:%d\n", m_bItemOn, m_bShowTab);
if(rect.Height()>10&&m_pNewTab->GetSafeHwnd())
{
if(m_bItemOn)
{
m_pNewTab->ShowWindow(SW_HIDE);
}
else
{
if(m_bShowTab)
{
// m_pNewTab->SetWindowPos(
// &wndTop,rect_window.left-2,rect_window.top,//rect_top-20,
// rect.Width ()+10,nTabHeigh,
// SWP_DRAWFRAME|SWP_SHOWWINDOW);
m_pNewTab->SetWindowPos(&wndTop, rect.left-2, 0, rect.Width()+10, nTabHeigh, SWP_DRAWFRAME|SWP_SHOWWINDOW|SWP_FRAMECHANGED);
}
else
{
m_pNewTab->ShowWindow(SW_HIDE);
}
}
}
}
// Do not call CScrollView::OnNcPaint() for painting messages
}
uj5u.com熱心網友回復:
請說明哪段代碼 畫NC !uj5u.com熱心網友回復:
m_pNewTab->SetWindowPos(&wndTop, rect.left-2, 0, rect.Width()+10, nTabHeigh, SWP_DRAWFRAME|SWP_SHOWWINDOW|SWP_FRAMECHANGED);這一段是畫tab的,還有兩處是畫scrollBar的,主要是畫tab的有問題
uj5u.com熱心網友回復:
tab 在 客戶區 , 為什么 不在 OnDraw (畫客戶區)處理, 與 非客戶區 (NC)何關 ?uj5u.com熱心網友回復:
m_pNewTab->SetWindowPos(&wndTop, rect.left-2, 0, rect.Width()+10, nTabHeigh, SWP_DRAWFRAME|SWP_SHOWWINDOW|SWP_FRAMECHANGED);這里y=0的店不在客戶區上,是在客戶區外
uj5u.com熱心網友回復:
YSpecifies the new position of the top of the window, in client coordinates.
"這里y=0的店不在客戶區上,是在客戶區外" ??
子視窗 必須 在 父視窗的 客戶區 內 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/110986.html
標籤:界面
