;运行效果

;win32汇编环境,窗口程序中单选框的一般操作示例
 ;比如在窗口程序中生成单选框,默认哪项选中,判断当前选中哪一项,让哪项选中,得到选中项的名称等
 ;直接抄进RadAsm可编译运行。重点部分加备注。
 ;以下是ASM文件
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .386 
 .model flat,stdcall 
 option casemap:none 
 include      windows.inc 
 include      user32.inc           
 include      kernel32.inc 
 include      gdi32.inc
includelib   kernel32.lib 
 includelib   user32.lib 
 includelib   gdi32.lib
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       
                                                 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .DATA                                   
 ClassName   db "SimpleWinClass",0        
 AppName     db "窗口程序的模版",0        
szButtonClassName   db "button",0              ;单选框属于按钮类名
 szTitle             db "提示",0 
szCheckTitle        db "请选一位美女",0
 szCheckTitle01      db "西施",0 
 szCheckTitle02      db "绍婵",0
 szCheckTitle03      db "妲已",0
 szChecked01         db "当前选中的是: 西施",0 
 szChecked02         db "当前选中的是: 绍婵",0 
 szChecked03         db "当前选中的是: 妲已",0 
szCheshi_Format01   db "得到的数字是 %d",0
 szCheshi_Format02   db "得到的字符串的字节数是 %d",0
szButtonTitle01     db "点击查看当前选定了哪一项",0 
 szButtonTitle02     db "让所有项都处于未选中状态",0 
 szButtonTitle03     db "选中第3项",0 
 szButtonTitle04     db "得到第1项的名称",0 
 szButtonTitle05     db "得到第2个编辑框的密码",0 
.DATA?                                  
 hInstance HINSTANCE  ?                
 CommandLine LPSTR    ? 
 hID_GROUP    dd ?        ;组框控件句柄
 hID_CHECK01  dd ?        ;单选框控件句柄
 hID_CHECK02  dd ?   
 hID_CHECK03  dd ? 
hIDB01       dd ?        ;按钮控件句柄
 hIDB02       dd ?  
 hIDB03       dd ?  
 hIDB04       dd ?
.CONST               
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Equ 等值定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ID_CHECK01  equ 11        ;编辑框控件标识符
 ID_CHECK02  equ 12
 ID_CHECK03  equ 13  
      
 IDB01       equ 21        ;按钮控件标识符
 IDB02       equ 22  
 IDB03       equ 23  
 IDB04       equ 24
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .CODE                      
start:                      
 invoke GetModuleHandle, NULL                                                    
 mov hInstance,eax 
 invoke GetCommandLine                                                                                       
 mov CommandLine,eax 
 invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT        
 invoke ExitProcess, eax                                          
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
         LOCAL wc:WNDCLASSEX                                          
         LOCAL msg:MSG 
         LOCAL hwnd:HWND 
        mov   wc.cbSize,SIZEOF WNDCLASSEX                            
         mov   wc.style, CS_HREDRAW or CS_VREDRAW                     
         mov   wc.lpfnWndProc, OFFSET WndProc                        
         mov   wc.cbClsExtra,NULL 
         mov   wc.cbWndExtra,NULL 
         push  hInstance 
         pop   wc.hInstance 
         mov   wc.hbrBackground,COLOR_WINDOW+1 
         mov   wc.lpszMenuName,NULL 
         mov   wc.lpszClassName,OFFSET ClassName 
         invoke LoadIcon,NULL,IDI_APPLICATION                          
         mov   wc.hIcon,eax 
         mov   wc.hIconSm,eax 
         invoke LoadCursor,NULL,IDC_ARROW                              
         mov   wc.hCursor,eax 
         invoke RegisterClassEx, addr wc                              
         invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX ,100,100,250,340, NULL,NULL,hInst, NULL 
         mov   hwnd,eax 
         invoke ShowWindow, hwnd,CmdShow                              
          invoke UpdateWindow, hwnd                                    
        .while TRUE                                                   
                 invoke GetMessage, ADDR msg,NULL,0,0 
                 .break .if (!eax) 
                 invoke TranslateMessage, ADDR msg 
                 invoke DispatchMessage, ADDR msg 
         .endw 
         mov     eax,msg.wParam                                         
         ret 
 WinMain endp 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM  
         LOCAL   @DEFAULT_GUI_FONT,@OLD_DEFAULT_GUI_FONT
         LOCAL   @szBuffer[256]:byte
         LOCAL   @szBuffer01[256]:byte
         
         .if uMsg == WM_CREATE              
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szCheckTitle, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_GROUPBOX,10,10,220,105,hWnd,NULL,NULL,NULL                      ;创建组框控件                 
                 mov hID_GROUP,eax  
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szCheckTitle01, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_AUTORADIOBUTTON,20,30,200,25,hWnd,ID_CHECK01,NULL,NULL        ;创建单选框控件                 
                 mov hID_CHECK01,eax   
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szCheckTitle02, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_AUTORADIOBUTTON,20,55,200,25,hWnd,ID_CHECK02,NULL,NULL                    
                 mov hID_CHECK02,eax   
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szCheckTitle03, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_AUTORADIOBUTTON,20,80,200,25,hWnd,ID_CHECK03,NULL,NULL                   
                 mov hID_CHECK03,eax   
                               
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle01, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON   ,20,140,200,25,hWnd,IDB01,NULL,NULL           ;创建按钮控件                 
                 mov hIDB01,eax                
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle02, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,20,180,200,25,hWnd,IDB02,NULL,NULL                       
                 mov hIDB02,eax                
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle03, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,20,220,200,25,hWnd,IDB03,NULL,NULL                        
                 mov hIDB03,eax                
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle04, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,20,260,200,25,hWnd,IDB04,NULL,NULL                        
                 mov hIDB04,eax                
                  
                 invoke  GetStockObject,DEFAULT_GUI_FONT                                        ;调用GetStockObject函数,得到系统默认字体                
                 mov @DEFAULT_GUI_FONT,eax  
                 invoke  SendMessage,hID_GROUP,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                 ;发送WM_SETFONT消息,设置控件的字体                            
                 invoke  SendMessage,hID_CHECK01,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                               
                 invoke  SendMessage,hID_CHECK02,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE 
                 invoke  SendMessage,hID_CHECK03,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE               
               
                 invoke  SendMessage,hIDB01,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                
                 invoke  SendMessage,hIDB02,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                
                 invoke  SendMessage,hIDB03,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                
                 invoke  SendMessage,hIDB04,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                
               
                 invoke  DeleteObject,@DEFAULT_GUI_FONT                                          ;删除本程序新建的字体
                invoke    CheckDlgButton,hWnd,ID_CHECK02,BST_CHECKED                            ;可以先初始化让哪个处于选定状态,初定为第2项 
         .elseif uMsg == WM_COMMAND                                
                 mov eax,wParam                 
                 .if lParam != 0                                                                                                               
                         mov edx,wParam                                                                                           
                         shr edx,16                                                                                               
                         .if dx == BN_CLICKED                                              
                                 .if ax == IDB01                                        
                                         invoke IsDlgButtonChecked,hWnd,ID_CHECK01                               ;检查第1项是否选中                                        
                                         .if eax == BST_CHECKED                                                  ;如果选中,则弹出提示                                            
                                                 invoke MessageBox,NULL,addr szChecked01,addr szTitle,MB_OK                                            
                                         .endif                                        
                                         invoke IsDlgButtonChecked,hWnd,ID_CHECK02                                        
                                         .if eax == BST_CHECKED                                            
                                                 invoke MessageBox,NULL,addr szChecked02,addr szTitle,MB_OK                                        
                                         .endif                                        
                                         invoke IsDlgButtonChecked,hWnd,ID_CHECK03                                       
                                         .if eax == BST_CHECKED                                           
                                                 invoke MessageBox,NULL,addr szChecked03,addr szTitle,MB_OK                                        
                                         .endif                                
                                 .elseif ax == IDB02                                        
                                         invoke  CheckDlgButton,hWnd,ID_CHECK01,BST_UNCHECKED                    ;让3项都未选中                                        
                                         invoke  CheckDlgButton,hWnd,ID_CHECK02,BST_UNCHECKED                                        
                                         invoke  CheckDlgButton,hWnd,ID_CHECK03,BST_UNCHECKED                                   
                                 .elseif ax == IDB03                                        
                                         invoke  CheckDlgButton,hWnd,ID_CHECK03,BST_CHECKED                      ;选中第3项                                        
                                         invoke  CheckDlgButton,hWnd,ID_CHECK01,BST_UNCHECKED                                                
                                         invoke  CheckDlgButton,hWnd,ID_CHECK02,BST_UNCHECKED                                
                                 .elseif ax == IDB04                                        
                                         invoke GetDlgItemText,hWnd,ID_CHECK01,addr @szBuffer,sizeof @szBuffer   ;得到第1项的名称                                        
                                         invoke MessageBox,hWnd,addr @szBuffer,addr szTitle,MB_OK or MB_ICONINFORMATION                                 
                                 .endif                              
                         .endif                
                 .endif   
         .elseif uMsg==WM_DESTROY                                           
                 invoke PostQuitMessage,NULL                               
         .else 
                 invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
         ret 
     .endif 
     xor eax,eax 
     ret 
 WndProc endp 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 end start