先說一下 靜態創建的方法:
單選按鈕也屬於CButton類,但由於單選按鈕總是成組使用的,所以它在制作和使用上與普通按鈕有一定區別。
假設有三個單選按鈕組成一組,初始時,第一個單選按鈕處於選中狀態。
我們先來看靜態制作方法:在對話框中放置三個單選按鈕,設置屬性如下:
Radio1屬性:Visible、Group、Tab stop、Auto
Radio2屬性:Visible、Tab stop、Auto
Radio3屬性:Visible、Tab stop、Auto
這樣的屬性設置就把三個單選按鈕分成了一組,它們一次只能有一個被選中,若對話框中還有其它成組的單選按鈕,使用時也會互不干擾。但這時還沒有使第一個按鈕處於選中狀態。接著就用ClassWizard為這組單選按鈕添加變量,這裡只需為第一個單選按鈕添加變量即可。設變量名為m_Radio,類型選為int型。在構造函數中ClassWizard把m_Radio的值設置為-1,我們把它改為0,這樣在運行程序時可以看到第一個單選按鈕處於選中狀態了。之後,還應該用ClassWizard為三個單選按鈕添加單擊響應函數,在裡面修改m_Radio的值對應三個單選按鈕就可以了。
在這個靜態創建時,是手工指定了Group屬性.那麼如何在動態創建時,指定這個屬性呢.我在所有的方法裡面找了一圈,沒有發現.
那會是在哪兒設置呢,總得有個辦法吧! 那就只省下哪一個辦法了,就是 ModifyStyle 方法,看看這個方法裡面有沒有相應的樣式!
我先查了按鈕的樣式
#define BS_PUSHBUTTON 0x00000000L #define BS_DEFPUSHBUTTON 0x00000001L #define BS_CHECKBOX 0x00000002L #define BS_AUTOCHECKBOX 0x00000003L #define BS_RADIOBUTTON 0x00000004L #define BS_3STATE 0x00000005L #define BS_AUTO3STATE 0x00000006L #define BS_GROUPBOX 0x00000007L #define BS_USERBUTTON 0x00000008L #define BS_AUTORADIOBUTTON 0x00000009L #define BS_PUSHBOX 0x0000000AL #define BS_OWNERDRAW 0x0000000BL #define BS_TYPEMASK 0x0000000FL #define BS_LEFTTEXT 0x00000020L #if(WINVER >= 0x0400) #define BS_TEXT 0x00000000L #define BS_ICON 0x00000040L #define BS_BITMAP 0x00000080L #define BS_LEFT 0x00000100L #define BS_RIGHT 0x00000200L #define BS_CENTER 0x00000300L #define BS_TOP 0x00000400L #define BS_BOTTOM 0x00000800L #define BS_VCENTER 0x00000C00L #define BS_PUSHLIKE 0x00001000L #define BS_MULTILINE 0x00002000L #define BS_NOTIFY 0x00004000L #define BS_FLAT 0x00008000L #define BS_RIGHTBUTTON BS_LEFTTEXT #endif /* WINVER >= 0x0400 */
找到所有的樣式,裡面在沒有相應的設置,與GROUP相關的,只有一個 BS_GROUPBOX ,我試了一下,這個樣式的意思,就是將按鈕改造成一個GROUPBOX,而不是指定 GROUP.不對. 除此之外,就只能找上一層的樣式也就是 CWnd的樣式了.
#define WS_OVERLAPPED 0x00000000L #define WS_POPUP 0x80000000L #define WS_CHILD 0x40000000L #define WS_MINIMIZE 0x20000000L #define WS_VISIBLE 0x10000000L #define WS_DISABLED 0x08000000L #define WS_CLIPSIBLINGS 0x04000000L #define WS_CLIPCHILDREN 0x02000000L #define WS_MAXIMIZE 0x01000000L #define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */ #define WS_BORDER 0x00800000L #define WS_DLGFRAME 0x00400000L #define WS_VSCROLL 0x00200000L #define WS_HSCROLL 0x00100000L #define WS_SYSMENU 0x00080000L #define WS_THICKFRAME 0x00040000L #define WS_GROUP 0x00020000L #define WS_TABSTOP 0x00010000L #define WS_MINIMIZEBOX 0x00020000L #define WS_MAXIMIZEBOX 0x00010000L #define WS_TILED WS_OVERLAPPED #define WS_ICONIC WS_MINIMIZE #define WS_SIZEBOX WS_THICKFRAME #define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW
裡面果真有一個 WS_GROUP ,這就是我想要的,於是
((CButton*)GetDlgItem(IDC_CHECK1))->ModifyStyle(BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON | WS_GROUP, 0);
至此 動態創建按鈕組的方法也有了!