一个简单的单文档程序(工程名cai),我在CCaiView中添加了一个消息处理函数。 
void CCaiView::OnLButtonUp(UINT nFlags, CPoint point) 

HDC hdc; 
hdc=::GetDC(::GetParent(m_hWnd)); 
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); 
LineTo(hdc,point.x,point.y); 
::ReleaseDC(::GetParent(m_hWnd),hdc); CView::OnLButtonUp(nFlags, point); 

其中m_ptOrigin是已经添加到CCaiView类的private成员,类型为Point,并且在void CCaiView::OnLButtonDown(UINT nFlags, CPoint point)中已记录下起点。 请问为什么子窗口获得父窗口DC句柄后可以同时在子视窗口和父窗口画图,消息是从不同窗口获取的啊!!(我开始以为是画了两条线,是这样吗)

解决方案 »

  1.   

    hdc=::GetDC(::GetParent(m_hWnd)); 
    这里的m_hWnd指的是什么?
      

  2.   

    m_hWnd是继承自CWnd类的成员,保存窗口句柄啊。
    现在的值指的是视窗口的句柄。
      

  3.   

    既然你取得了父窗口的dc,当然就可以在父窗口中画图了。如果你取得了桌面的DC,你也可以在桌面上画图啊。不过怎么取我也不知道。
    hdc=::GetDC(::GetParent(m_hWnd)); 
    m_hWnd是本窗口的句柄,实际上就是CCaiView的句柄
    ::GetParent(m_hWnd)取得的应该是框架的句柄。CMainFrm的。::GetDC(::GetParent(m_hWnd))就是取得父窗口的设备环境句柄。
      

  4.   

    取得哪个窗口的DC就能在那个窗口画图,我取的是父窗口但为什么在CCaiView中也能画图?我在子窗口按下鼠标左键,然后在主框架窗口释放,请问消息是怎么被捕获的?谢谢大家来回答!!!
      

  5.   

    取得桌面的DC应该是调用CWnd::GetDesktopWindow()
      

  6.   

    DC 只是一个环境描述(里面有 位置,尺寸等信息)在Dos 时代,程序拥有整个屏幕,可以在 windows 的多任务时代显然是不行的,但如查做多个屏幕缓冲来存放自已的内容虽然可以有效的做到显示独立,但这样的代价太大,对于硬件来说也是一个负但
    windows 用了一个聪明的方法,还是一个屏幕,然后将他分成"区域",这些"区域"用一个描述来表示,当然这其中不只是存放位置,大小等信息。程序在绘图时只是在自已的区域中绘制,因为API 底层的检测机制所以你不会绘制到区域以外的地方。但是如果是子窗全因为拥有和父窗全相同的区域,所以父窗体绘制的图像,会在子窗体区域中显示,但为什么我们一般情况下看不到呢,因为在父窗体刷新时,子窗体也刷新了,所以是看不出来的。如果你出现了上面情况 说明你的刷新机制有问题!
      

  7.   

    to 我在子窗口按下鼠标左键,然后在主框架窗口释放,请问消息是怎么被捕获的?鼠标的按下和释放是两个消息.而鼠标的移动是另一个消息.对应你的操作过程:
    子窗口收到鼠标按下消息,然后你的鼠标移动操作又被发送到子窗口。你的鼠标移动到主窗口后,主窗口收到鼠标移动消息。你在主窗口放开鼠标,鼠标释放消息又被发送到主窗口。
    其中鼠标移动消息是连续多个。鼠标按下,在两个窗口间移动的时候,有时候还有dropin 和dropout消息。