谈谈WS_EX_CLIENTEDGE窗口风格

关于该风格要注意几点的是:

  1. WS_EX_CLIENTEDGE窗口风格并不是对所有窗口都有效,只有窗口有客户区的时候才有效,这样当它用在比如button,combox,tab无客户区的控件时,它是无效的。
  2. 通过对话框模版创建的控件ListCtrl,如果你指定了WS_BORDER,这时WS_BORDER将被拿掉,而WS_EX_CLIENTEDGE会被设置上。但是如果你通过create手动创建则不会出现这种情况。
  3. 当WS_EX_CLIENTEDGE设置上,在控件边缘和客户区之间将有2个像素大小的空隙,与其他做比较:WS_BORDER,一个像素,WS_EX_WINDOWEDGE为3个象素;WS_EX_STATICEDGE为1个像素,当WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE,有5个像素,而WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_STATICEDGE还是5个像素,说明有像素重在一起的时候。
  4. WS_EX_CLIENTEDGE只在创建时设定有效,如果在创建之后设定,必须跟上另一个参数,SWP_DRAWFRAME或SWP_FRAMECHANGED,实际上这两者值完全一样。如下是通过create创建并添加WS_EX_CLIENTEDGE风格的例子:
    m_list.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT,CRect(0,0,100,100),this,0);
    m_list.ModifyStyleEx(0,WS_EX_CLIENTEDGE,SWP_FRAMECHANGED);

    原因在于当添加WS_EX_CLIENTEDGE实际上要重设客户区大小才能起作用,而重设客户区只能通过WM_NCCALCSIZE来设定,但是这个消息只有才创建时才会触发,单纯修改WGL_EXSTYLE属性并不会触发,添加SWP_FRAMECHANGED正是为了触发该消息。

你可能感兴趣的:(MFC编程)