用FindWindow API函数,或者你在调用画点函数时传一个窗口句柄也可以。
1.做DLL尽量不要用MFC,如果包含了MFC才能用CDC 类,所以建议使用HDC这是原始句柄,否则在DLL内用CDC这类会使DLL很大.传递句柄:pDC->m_hDC
2.窗口句柄用HWND,直接传入this->m_hWnd,没必要使用CWnd类
事实上不用传DC的,直接传HWND后,使用以下函数得到HDC即可:
HDC hDestDC = ::GetDC(HWND hWnd);//传入窗口句柄即可.
HDC hDC = ::CreateCompatibleDC(hDestDC);//这样做内存DC即可.
//这里绘图之类的相关............
::ReleaseDC(hDestDC);
::DeleteDC(hDC);
3.DLL建议做成类方便.
#define DLL_FUNCTION __declspec(dllexport)
class DLL_FUNCTION CDrawEx
{
public:
Draw(HWND hWnd);
//.....
};
//给个函数参考:
void CImgList::Draw(HDC hDC)
{
int nYpos = 4;
HBITMAP bmMonochrome = CreateCompatibleBitmap(hDC, 480,200);
RECT rtItem;
rtItem.left = 0;rtItem.top = 0;
rtItem.right = 480; rtItem.bottom = 200;
if(bmMonochrome){
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP OldBitmap = (HBITMAP)SelectObject(hMemDC, bmMonochrome);
FillRect(hMemDC, &m_rtBmSize, (HBRUSH)GetStockObject(WHITE_BRUSH) );
SetBkMode(hMemDC, TRANSPARENT);
SetTextColor(hMemDC, RGB(0,0,0));
int m_nItem = 200;
for(int nCur = m_nItem ; nCur < m_nItem + MAX_ITEM; nCur++){
MoveToEx(hMemDC, 0, rtItem.top, NULL);
LineTo(hMemDC, 480, rtItem.top);
DrawText(hMemDC, m_szData[nCur], wcslen(m_szData[nCur]), &rtItem, DT_CENTER | DT_VCENTER);
OffsetRect(&rtItem, 0, ITEM_HEIGHT);
}
// printf("top:%d\n", m_nTop);
BitBlt(hDC,0, 0, m_rtClient.right, m_rtClient.bottom, hMemDC, 0, m_nOffset, SRCCOPY);
SelectObject(hMemDC, OldBitmap);
DeleteObject(bmMonochrome );
DeleteDC(hMemDC);
}
}
HWND hWnd; // 消息发送窗口
class __declspec(dllexport) CXXXDLL
{
public:
CXXXDLL();
~CXXXDLL();
public:
void SetHwnd(HWND hWnd); //设置接收消息的窗口句柄
}
void CXXXDLL::SetHwnd(HWND handleWnd)
{
hWnd = handleWnd;
}
窗口 调用 动态库的SetHwnd 函数,将窗口句柄传给动态库, pDC 获得的方式也可以这样