实现的是一个ocx控件(作为一个窗口),在接受到ON_PAINT消息后进行描画处理。
在描画过程中,得到该控件所在父窗口的相应位置的窗口位图。在VC的基于对话框应用程序上,显示是正常的,但在VB的测试程序上,得到的则是Form下一层窗口的背景。一直找不出来原因在什么地方:(处理过程如下:已知:rc,dc,m_hWnd//得到父窗口句柄
HWND hParentWnd = GetParent(m_hWnd);(通过Spy++跟踪,该句柄正确)//rc区域的顶点坐标
long nWidth,nHigh;
nWidth = rc.right - rc.left ;
nHigh = rc.bottom - rc.top;
   
POINT mLTlp,mRBlp;
   
mLTlp.x = rc.left ;
mLTlp.y = rc.top;
mRBlp.x = rc.right;
mRBlp.y = rc.bottom;//映射到父窗口上
MapWindowPoints(m_hWnd,hParentWnd,&mLTlp,1);
MapWindowPoints(m_hWnd,hParentWnd,&mRBlp,1);//所要得到的窗口区域
RECT hDestRc;
hDestRc.left = mLTlp.x;
hDestRc.top = mLTlp.y;
hDestRc.right = mRBlp.x;
hDestRc.bottom = mRBlp.y;//区域不为空的时候作如下处理
 ShowWindow(hParentWnd,SW_SHOW);
 UpdateWindow(hParentWnd);//该窗口的DC以及内存DC
HDC hScrDC = GetWindowDC(hParentWnd);(这里通过GetDC(hParentWnd)得到的dc是不一样的,但是显示出来的效果却相同)
HDC hMemDC = CreateCompatibleDC(hScrDC);  //截取窗口到位图
HBITMAP hBitmap = CreateCompatibleBitmap (hScrDC, nWidth, nHeight);
   
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
   
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, hDestRc.left , hDestRc.top , SRCCOPY);
  
//hBitmap即是想要得到的位图句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);//在控件上显示
BitBlt(dc, rc.left, rc.top,nWidth,nHigh,hMemDC, 0, 0, SRCCOPY);DeleteDC(hScrDC);
DeleteDC(hMemDC);