我有兩個視窗一個名字類叫A,另一個名字叫B, A作為一個導航欄(nagative)用來預覽B 的東西,(詳情可看圖片)
,我在A類的onpaint 函式用cdc物件畫圖可以在A視窗和B視窗中都看到。不過我用一個第三方的庫C可以畫表格之類的東西我只需要設定行和列在系結一個父視窗就自己畫在B視窗中了,比如C x=new c()
C x=new c();
C->create(/**/);//若干個引數包括父視窗B;
C-setrowcount(1);
c->setcolcount(1);
不過這樣的 畫可以在父視窗B中顯示 A的預覽視窗卻看不到 因為用的不是A的cdc物件畫圖 ,大佬們怎么處理這個情況呢,那個庫C畫的CDC好像也不能指定用我類A的CDC,那可以把庫畫好的表格拷貝的類A的讓他顯示在導航欄,如果這樣視窗B里好像因為拷貝又多出來一個表格了。求救
uj5u.com熱心網友回復:
試試 PrintWindowuj5u.com熱心網友回復:
謝謝,兄弟,我明天試試uj5u.com熱心網友回復:
通過 剪貼板uj5u.com熱心網友回復:
bitbltuj5u.com熱心網友回復:
怎么用呢 兄弟。
uj5u.com熱心網友回復:
不行啊 我試過了 。。
C->ShowWindow(true);
pDC->BitBlt(0, 0, gridrect.Width(), lprect.Height(),pGrid->GetDC(), 0, 0, SRCCOPY);
之后就變成了這樣
uj5u.com熱心網友回復:
這個顯示 是可以顯示 不過多了個殘影 這樣我移動第三方庫那個畫好的grid的時候就可以看到兩個grid,有一個是殘影也就是 bitblt畫出來的而且大小還和那個第三方畫好的庫的大笑不一樣。并且之后把grid移動到殘影附近 才能在縮略圖中看到那個殘影 還是不是griduj5u.com熱心網友回復:
bitblt畫出來的就只是圖片了,不能區分物件了。如果原來的影像有變動,你要擦除,然后重繪才可以,記得先擦除。
uj5u.com熱心網友回復:
BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
BOOL bRet = FALSE;
if(hDC && hWnd && IsWindow(hWnd))
{
//保存DC
int nSaveDC = SaveDC(hDC);
//獲取視窗坐標
RECT rcWnd;
GetWindowRect(hWnd, &rcWnd);
//獲取視窗DC
HDC hWndDC = GetWindowDC(hWnd);
if(hWndDC != NULL)
{
//設定縮放模式
SetStretchBltMode(hDC, HALFTONE);
//縮放貼圖
StretchBlt(hDC,
rcRect.left, rcRect.top,
rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
hWndDC,
0, 0,
rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
SRCCOPY);
//釋放DC
ReleaseDC(hWnd, hWndDC);
bRet = TRUE;
}
//恢復DC
RestoreDC(hDC, nSaveDC);
}
return bRet;
}
void CSdi7View::OnDraw(CDC* pDC)
{
/*
CSdi7Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
*/
//計算器
HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);
}

uj5u.com熱心網友回復:
pDC->BitBlt(0, 0, gridrect.Width(), lprect.Height(),pGrid->GetDC()pDC 是什么 pGrid->GetDC() 又是什么
uj5u.com熱心網友回復:
BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
BOOL bRet = FALSE;
if(hDC && hWnd && IsWindow(hWnd))
{
//保存DC
int nSaveDC = SaveDC(hDC);
//獲取視窗坐標
RECT rcWnd;
GetWindowRect(hWnd, &rcWnd);
//獲取視窗DC
HDC hWndDC = GetWindowDC(hWnd);
if(hWndDC != NULL)
{
//設定縮放模式
SetStretchBltMode(hDC, HALFTONE);
//縮放貼圖
StretchBlt(hDC,
rcRect.left, rcRect.top,
rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
hWndDC,
0, 0,
rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
SRCCOPY);
//釋放DC
ReleaseDC(hWnd, hWndDC);
bRet = TRUE;
}
//恢復DC
RestoreDC(hDC, nSaveDC);
}
return bRet;
}
void CSdi7View::OnDraw(CDC* pDC)
{
/*
CSdi7Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
*/
//計算器
HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);
}
(1)第一個就是 畫好的縮略圖 不能和我的那個表格一個大小
(2)那個縮略圖 能放我到我和表格一樣的位置嗎,就是我的表格覆寫在那個縮略圖面
看圖scoreboard_two:

還有一個就是 當我父視窗滾動條移動的時候那個縮略圖會變 連我系統推送的那個網站都看到了,,這個怎么解決啊。。看下圖
uj5u.com熱心網友回復:
BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
BOOL bRet = FALSE;
if(hDC && hWnd && IsWindow(hWnd))
{
//保存DC
int nSaveDC = SaveDC(hDC);
//獲取視窗坐標
RECT rcWnd;
GetWindowRect(hWnd, &rcWnd);
//獲取視窗DC
HDC hWndDC = GetWindowDC(hWnd);
if(hWndDC != NULL)
{
//設定縮放模式
SetStretchBltMode(hDC, HALFTONE);
//縮放貼圖
StretchBlt(hDC,
rcRect.left, rcRect.top,
rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
hWndDC,
0, 0,
rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
SRCCOPY);
//釋放DC
ReleaseDC(hWnd, hWndDC);
bRet = TRUE;
}
//恢復DC
RestoreDC(hDC, nSaveDC);
}
return bRet;
}
void CSdi7View::OnDraw(CDC* pDC)
{
/*
CSdi7Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
*/
//計算器
HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);
}
uj5u.com熱心網友回復:
BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
BOOL bRet = FALSE;
if(hDC && hWnd && IsWindow(hWnd))
{
//保存DC
int nSaveDC = SaveDC(hDC);
//獲取視窗坐標
RECT rcWnd;
GetWindowRect(hWnd, &rcWnd);
//獲取視窗DC
HDC hWndDC = GetWindowDC(hWnd);
if(hWndDC != NULL)
{
//設定縮放模式
SetStretchBltMode(hDC, HALFTONE);
//縮放貼圖
StretchBlt(hDC,
rcRect.left, rcRect.top,
rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
hWndDC,
0, 0,
rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
SRCCOPY);
//釋放DC
ReleaseDC(hWnd, hWndDC);
bRet = TRUE;
}
//恢復DC
RestoreDC(hDC, nSaveDC);
}
return bRet;
}
void CSdi7View::OnDraw(CDC* pDC)
{
/*
CSdi7Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
*/
//計算器
HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);
}
uj5u.com熱心網友回復:
1 兩個視窗 是不是 在 一個 行程 里 ?2 要復制 客戶區 還是 整個 視窗 ?
uj5u.com熱心網友回復:
1。應該不是一個行程2。客戶區吧,就是那個視窗b的,視窗b有滾動條,
zgl老哥的方法可行,,不過當我滾動潭訓動的時候,那個縮略圖,把我視窗外面的win系統推送的網頁都顯示出來了,不可思議,,,不太懂
uj5u.com熱心網友回復:
BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
BOOL bRet = FALSE;
if(hDC && hWnd && IsWindow(hWnd))
{
//保存DC
int nSaveDC = SaveDC(hDC);
//獲取視窗坐標
RECT rcWnd;
GetWindowRect(hWnd, &rcWnd);
//獲取視窗DC
HDC hWndDC = GetWindowDC(hWnd);
if(hWndDC != NULL)
{
//設定縮放模式
SetStretchBltMode(hDC, HALFTONE);
//縮放貼圖
StretchBlt(hDC,
rcRect.left, rcRect.top,
rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
hWndDC,
0, 0,
rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
SRCCOPY);
//釋放DC
ReleaseDC(hWnd, hWndDC);
bRet = TRUE;
}
//恢復DC
RestoreDC(hDC, nSaveDC);
}
return bRet;
}
void CSdi7View::OnDraw(CDC* pDC)
{
/*
CSdi7Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
*/
//計算器
HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);
}
對了 我把這段代碼改了:
HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);----》auto hWnd=pGrid->getsafeHwnd(); //換成了我那個表格的hwnd,應該沒有關系吧?? 我不太懂1 兩個視窗 是不是 在 一個 行程 里 ?
2 要復制 客戶區 還是 整個 視窗 ?
1。應該不是一個行程
2。客戶區吧,就是那個視窗b的,視窗b有滾動條,
zgl老哥的方法可行,,不過當我滾動潭訓動的時候,那個縮略圖,把我視窗外面的win系統推送的網頁都顯示出來了,不可思議,,,不太懂
uj5u.com熱心網友回復:
1 兩個視窗 是不是 在 一個 行程 里 ?
2 要復制 客戶區 還是 整個 視窗 ?
uj5u.com熱心網友回復:
如果是控制元件的話,可以試試 GetWindowDC 換成 GetDC, GetWindowRect 換成 GetClientRectuj5u.com熱心網友回復:
如果是控制元件的話,可以試試 GetWindowDC 換成 GetDC, GetWindowRect 換成 GetClientRect
1)這個縮略圖的大小和我原來的那個表格大小不一樣。。怎么調整呢。。我那個strechblt里設定原位圖的坐標是對的啊:
auto rect=CRect();
pGrid->GetWindowRect(&rect);
pDC->StretchBlt(parentlogicrect.left, parentlogicrect.top,//parentlogicrect 是父視窗的大小
parentlogicrect.Width(), parentlogicrect.Height(),
pGrid->GetDC(),
0, 0,
gridlogicrect.Width(), gridlogicrect.Height(),
SRCCOPY);
2.怎么擦除那個縮略圖呢 就是我拖動那個矩形框嵌套里面的表格會移動 但是我那個縮略圖的位置還是不變。。。我想移動之后擦除在重畫
uj5u.com熱心網友回復:
偷工減料是不行的,兩個CDC就要畫兩次。你把B視窗的CDC句柄保存到A里面,畫的地方封裝成一個函式,CDC為引數,通過傳入不同的CDC呼叫兩次函式看可不可以。uj5u.com熱心網友回復:
復制 粘貼uj5u.com熱心網友回復:
CDC 是·不能· 跨行程 的 !uj5u.com熱心網友回復:
如果是控制元件的話,可以試試 GetWindowDC 換成 GetDC, GetWindowRect 換成 GetClientRect
pDC->StretchBlt(sourcePos.left, sourcePos.top,
(sourcePos.Width()), (sourcePos.Height()),
pGrid->GetDC(),
0, 0,
griddevicerect.Width(), griddevicerect.Height(),
SRCCOPY);
uj5u.com熱心網友回復:
如果是控制元件的話,可以試試 GetWindowDC 換成 GetDC, GetWindowRect 換成 GetClientRect

對了 12是兩個分別不同的圖區,可以通過圖中圓圈那個地方左右拉動改變1和2的大小,如果我往左邊拉讓1變小就能不顯示桌面上的通知,只顯示表格,如果往右拉,讓2變小 就會顯示桌面上的通知,
uj5u.com熱心網友回復:
如果是控制元件的話,可以試試 GetWindowDC 換成 GetDC, GetWindowRect 換成 GetClientRect
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/15217.html
標籤:界面
