在dll中怎样获得主应用程序句柄 100
在dll中我创建了两个接口函数,一个是画图,另一个是在图上画点。因为图比较大,我在图上画点时需要获得窗口滚动条位置,怎样获得主应用程序的窗口句柄呢?还有,画图和画点的CD...
在dll中我创建了两个接口函数,一个是画图,另一个是在图上画点。因为图比较大,我在图上画点时需要获得窗口滚动条位置,怎样获得主应用程序的窗口句柄呢?还有,画图和画点的CDC* pDC怎样获得呢?
展开
3个回答
展开全部
用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);
}
}
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 获得的方式也可以这样
class __declspec(dllexport) CXXXDLL
{
public:
CXXXDLL();
~CXXXDLL();
public:
void SetHwnd(HWND hWnd); //设置接收消息的窗口句柄
}
void CXXXDLL::SetHwnd(HWND handleWnd)
{
hWnd = handleWnd;
}
窗口 调用 动态库的SetHwnd 函数,将窗口句柄传给动态库, pDC 获得的方式也可以这样
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询