vc自画窗体 黑边去除

来源:互联网 发布:黑马程序员 c 课件 编辑:程序博客网 时间:2024/05/01 13:22

貌似无论怎么设置,窗体总有一条黑边

暂时没找到办法能去除这条黑边

通过WM_NC_CALCSIZE可以看到客户区比窗口区域缩了1个像素

这样就会导致自画窗口边缘1个像素的内容很随机凌乱

可以做几件事儿:

1,在WM_NCPAINT中

    case WM_NCPAINT:        {            HDC hDC = ::GetWindowDC(m_hWnd);            if(hDC != NULL)            {                RECT rtWnd = {0}, rtClient = {0};                ::GetWindowRect(m_hWnd, &rtWnd);                ::GetClientRect(m_hWnd, &rtClient);                ::ClientToScreen(m_hWnd, (LPPOINT)&rtClient);                ::ClientToScreen(m_hWnd, ((LPPOINT)&rtClient)+1);                ::OffsetRect(&rtClient, -rtWnd.left, -rtWnd.top);                HRGN hRgn = ::CreateRectRgn(rtClient.left, rtClient.top, rtClient.right, rtClient.bottom);                ::ExtSelectClipRgn(hDC, hRgn,  RGN_DIFF);                ::DeleteObject(hRgn);                hRgn = NULL;                rtWnd.right = rtWnd.right - rtWnd.left;                rtWnd.left = 0;                rtWnd.bottom = rtWnd.bottom - rtWnd.top;                rtWnd.top = 0;                ::FillRect(hDC, &rtWnd, m_hBrushBg);                ::ReleaseDC(m_hWnd, hDC);                hDC = NULL;            }   return 1L;        }        break;

来填充那一个像素的边界,但是注意要把客户区排除出去,不然界面子控件容易出现问题

注意 return 1L

 

2.在WM_ERASEBKGND中重画背景,防止最大化最小化闪烁

    case WM_ERASEBKGND:        {            HDC hDC = ::GetDC(m_hWnd);            ::BitBlt((HDC)wParam, 0, 0, m_oMemDC.GetWidth(), m_oMemDC.GetHeight(),                m_oMemDC, 0, 0, SRCCOPY);            ::ReleaseDC(m_hWnd, hDC);        }        return 1L;

注意 return 1L
 

3.在WM_PAINT中注意清理屏幕后再画图。


4.如果以一个图片(例如500*345的图片)来作为背景图,因为有1个像素的NC区域,所以界面初始化的时候窗口大小应该为

SetWindowPos(NULL, 0, 0, 500 + 2, 345 + 2, SWP_NOMOVE);


貌似也可以用

AdjustWindowRectEX


函数来计算窗口大小


5.关于窗口圆角透明,还以上面图片为例

窗口初始化时候(窗口已经为无边框的样式)

        SetWindowPos(NULL, 0, 0, 500 + 2, 345 + 2, SWP_NOMOVE);        CenterWindow();        ::SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED);        ::SetLayeredWindowAttributes(m_hWnd, RGB(1,3,5), 0, 1);        ::SetWindowLong(m_hWnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED);

前面的

m_hBrushBg

为RGB(1,3,5)的画刷

WM_PAINT的时候再次调用这个画刷填充图片
PNG图片透明部分为完全透明,不能半透明

 

 


 

 



 

	
				
		
原创粉丝点击