有哪位大蝦知道SPY++是用什麼方法在WINDOW上畫方框的?

mate 2001-02-21 07:55:00
我自已試用GetWindowDC和GetWindowRect來在窗口上畫框,然后call Invalidate()來讓窗口自已复原。但此法對于子窗口還可以,對于主窗口郤一點都畫不出來。而spy++沒有此問題。而且它取消方框不知是用的什麼方法,我查過,它并沒有發出WM_PAINT消息。
另外,有誰知道SPY++用什麼方法得到的MOUSE 下的WINDOW指針(不是用WindowFromPoint())
...全文
193 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
随风bj 2001-02-24
  • 打赏
  • 举报
回复
代码如下:
void SKDemo_DrawWindowFrame (HWND hwndSubject)
{
HDC hdc;
RECT rc;
HPEN hpen;
GetWindowRect(hwndSubject, &rc); //得到窗口的尺寸
hdc = GetWindowDC(hwndSubject); //从句柄得到dc
SaveDC(hdc); //储存dc
SetROP2(hdc, R2_NOT); //设置hdc为做R2_NOT(反)运算模式
//------------------------------------------------创建画笔并选入dc中
hpen = CreatePen(PS_INSIDEFRAME, 3 * GetSystemMetrics(SM_CXBORDER),
RGB(0, 0, 0));
SelectObject(hdc, hpen);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
//------------------------------------------------
Rectangle(hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top); //画一个矩形
RestoreDC(hdc, -1); //恢复dc
ReleaseDC(hwndSubject, hdc); //释放hdc
DeleteObject(hpen); //释放hpen
}
随风bj 2001-02-24
  • 打赏
  • 举报
回复
看看我写的一个小工具aimtarget (csdn上有),是不是那个意思?
mate 2001-02-24
  • 打赏
  • 举报
回复
To In355Hz,Wanglst:
我遇到的主要問題是無法在窗口的邊框上畫rect。雖然我取得窗口的rect和dc,但是在標題欄和窗口邊框上面不能畫上任何東西。而spy是在窗口的外框上畫rect。
In355Hz 2001-02-24
  • 打赏
  • 举报
回复
要用GetWindowDC()取得hdc,这样的hdc才能在非客户区做图
wang1st 2001-02-22
  • 打赏
  • 举报
回复
使用DrawDragRect能自己擦掉以前画的边框


CDC::DrawDragRect
void DrawDragRect( LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush = NULL, CBrush* pBrushLast = NULL );

Remarks

Call this member function repeatedly to redraw a drag rectangle. Call it in a loop as you sample mouse position, in order to give visual feedback. When you call DrawDragRect, the previous rectangle is erased and a new one is drawn. For example, as the user drags a rectangle across the screen, DrawDragRect will erase the original rectangle and redraw a new one in its new position. By default, DrawDragRect draws the rectangle by using a halftone brush to eliminate flicker and to create the appearance of a smoothly moving rectangle.

The first time you call DrawDragRect, the lpRectLast parameter should be NULL.

In355Hz 2001-02-21
  • 打赏
  • 举报
回复
对于第二个问题,这是MSDN上的原话:
The WindowFromPoint function does not retrieve a handle to a hidden or disabled window, even if the point is within the window. An application should use the ChildWindowFromPoint function for a nonrestrictive search.

可以用ChildWindowFromPoint进行完全搜索。
In355Hz 2001-02-21
  • 打赏
  • 举报
回复
哦,它使用SetROP2将框的色彩设为屏幕背景的反色(R2_NOT)
画出的框只要按原来的大小重画一次就可以消除
CDC.SetROP2(R2_NOT)
CDC.DrawRect(&rect); //画框
CDC.SetROP2(R2_NOT);
CDC.DrawRect(&rect); //消除

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧