关于CS_PARENTDC的问题

用GetDC获取的DC在控件上做图时可以在控件尺寸之外画图,有朋友说因为窗体类风格中CS_PARENTDC这个参数的原因,后来我试图将控件所属类的CS_PARENTDC去掉,但仍没有效果

C/C++ code

    HWND hwnd;
    hwnd = GetDlgItem(IDC_FRAME)->GetSafeHwnd();
    LONG i = GetWindowLong(hwnd ,  GWL_STYLE);

    SetWindowLong(hwnd , GWL_STYLE ,  i^CS_PARENTDC);
    HDC hDC;
    hDC = ::GetDC(hwnd);
    CDC dc;
    dc.Attach(hDC);
    dc.Rectangle(CRect(10,10,57,110));



后来我发现IDC_FRAME这个静态框的风格中ms没有CS_OWNDC, CS_CLASSDC, CS_PARENTDC这三个东西
但如果将上面的代码改为如下就好了
C/C++ code

    HWND hwnd;
    hwnd = GetDlgItem(IDC_FRAME)->GetSafeHwnd();
[color=#FF0000]    LONG i = GetWindowLong(m_hWnd ,  GWL_STYLE);[/color]// 获取主窗体的

    [color=#FF0000]SetWindowLong(hwnd , GWL_STYLE ,  i); [/color]// 
    HDC hDC;
    hDC = ::GetDC(hwnd);
    CDC dc;
    dc.Attach(hDC);
    dc.Rectangle(CRect(10,10,57,110));



不知这个为何

作者: colorfulcode   发布时间: 2010-08-18

CS_PARENTDC是窗口类的风格,不是窗口的风格。

作者: xxd_qd   发布时间: 2010-08-18

引用 1 楼 xxd_qd 的回复:
CS_PARENTDC是窗口类的风格,不是窗口的风格。


呃......

弱弱的问下,
那有没有什么类似SetWindowLong的函数来修改窗口类呢

作者: colorfulcode   发布时间: 2010-08-18

LONG i = GetWindowLong(m_hWnd , GWL_STYLE);// 获取主窗体的
SetWindowLong(hwnd , GWL_STYLE , i); // 
这样就好了?不可能吧,应该是SetWindowLong(hwnd , GWL_STYLE , i | WS_CLIPSIBLINGS)才会好吧。

作者: xxd_qd   发布时间: 2010-08-18

引用 3 楼 xxd_qd 的回复:
LONG i = GetWindowLong(m_hWnd , GWL_STYLE);// 获取主窗体的
SetWindowLong(hwnd , GWL_STYLE , i); //
这样就好了?不可能吧,应该是SetWindowLong(hwnd , GWL_STYLE , i | WS_CLIPSIBLINGS)才会好吧。


我这边试了下,确实可以的

作者: colorfulcode   发布时间: 2010-08-18

引用 2 楼 colorfulcode 的回复:
引用 1 楼 xxd_qd 的回复:
CS_PARENTDC是窗口类的风格,不是窗口的风格。


呃......

弱弱的问下,
那有没有什么类似SetWindowLong的函数来修改窗口类呢

SetClassLong。
不过这个我也没用过。不知道修改完了以后是否生效,或者对已创建的窗口是否生效。

作者: xxd_qd   发布时间: 2010-08-18

获取了一下控件的窗口类风格,发现
hwnd = GetDlgItem(IDC_FRAME)->GetSafeHwnd();
LONG i = GetClassLong(hwnd , GWL_STYLE);

CS_OWNDC, CS_CLASSDC, CS_PARENTDC这三个没有一个被设置,那你之前说的,应该有个CS_PARENTDC吧

作者: colorfulcode   发布时间: 2010-08-18

LONG i = GetClassLong(hwnd , GCL_STYLE);

话说你怎么要这么麻烦,查窗口的各种属性用Spy看看不是很简单吗?有工具干嘛不用。

作者: xxd_qd   发布时间: 2010-08-18