请问手动复选框和自动复选框有什么区别?
我按照书上敲入的一个程序,为什么设置为手动复选框的那个复选框选定后不能再设置为UNCHECK(前面的勾点不去了)?

解决方案 »

  1.   

    void CMainWindow::OnCheckBoxClicked()
    {
    m_wndCheckBox.SetCheck(m_wndCheckBox.GetCheck() == BST_CHECKED ?
         BST_UNCHECKED : BST_CHECKED);
    }//m_wndCheckBox是和checkbox关联的控件变量。
      

  2.   

    不好意思 我是问SDK的实现,不是问MFC下的实现。然后就是手动复选框和自动复选框有什么区别?//SOURCE代码
    IDD_DIALOG DIALOG DISCARDABLE  0, 0, 187, 98
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Dialog"
    FONT 10, "System"
    BEGIN
        DEFPUSHBUTTON   "OK",IDOK,130,28,50,14
        PUSHBUTTON      "Cancel",IDCANCEL,130,65,50,14
        CHECKBOX        "CheckBox1",ID_CB1,22,16,53,10
        CONTROL         "CheckBox2",ID_CB2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
                        20,47,53,10
    END//代码
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    #include "Resource.h"LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK DialogFunc(HWND, UINT, WPARAM, LPARAM);char szWinName[ ] = "MyWin"; /* name of window class */
    HINSTANCE hInst;/* holds status of check boxes */
    int cbstatusl=BST_UNCHECKED, cbstatus2=BST_UNCHECKED;int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
                                  LPSTR lpszArgs, int nWinMode)
    {
       HWND hwnd;
       MSG msg;
       WNDCLASSEX wcl;
       HACCEL hAccel;
       
       /* Define a window class. */
       wcl.cbSize = sizeof(WNDCLASSEX);
       wcl.hInstance = hThisInst; /* handle to this instance */
       wcl.lpszClassName = szWinName; /* window class name */
       wcl.lpfnWndProc = WindowFunc; /* window function */
       wcl.style = 0; /* default style */
       wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* standard icon */
       wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO); /* small icon */
       wcl.hCursor = LoadCursor(NULL, IDC_ARROW); /* cursor style */
       wcl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); /* main menu */
       wcl.cbClsExtra = 0; /* no extra */
       wcl.cbWndExtra = 0; /* information needed */   /* Make the window white. */
       wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
       
        /* Register the window class. */
       if(!RegisterClassEx(&wcl)) return 0;   /* Now that a window class has been registered, a window
          can be created. */
       hwnd = CreateWindow(
          szWinName, /* name of window class */
          "Using Check Boxes", /* title */
          WS_OVERLAPPEDWINDOW, /* window style - normal */
          CW_USEDEFAULT, /* X coordinate - let Windows decide */
          CW_USEDEFAULT, /* Y coordinate - let Windows decide */
          CW_USEDEFAULT, /* width - let Windows decide */
          CW_USEDEFAULT, /* height - let Windows decide */
          HWND_DESKTOP, /* no parent window */
          NULL, /* no override of class menu */
          hThisInst, /* handle of this instance of the program */
          NULL /* no additional arguments */
       );
       hInst = hThisInst; /* save the current instance handle */
       
       /* Load accelerators. */
       hAccel = LoadAccelerators(hThisInst, MAKEINTRESOURCE(IDR_ACCELERATOR));
       
       /* Display the window. */
       ShowWindow(hwnd, nWinMode);
       UpdateWindow(hwnd);   /* Create the message loop. */
       while(GetMessage(&msg, NULL, 0, 0))
       {
          if(!TranslateAccelerator(hwnd, hAccel, &msg)) 
       {
             TranslateMessage(&msg); /* translate keyboard messages */
             DispatchMessage(&msg); /* return control to Windows 98 */
          }
       }
       return msg.wParam;
    }/* This function is called by Windows 98 and is passed
       messages from the message queue.
       */
    LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
                            WPARAM wParam, LPARAM lParam)
    {
       char str[255];
       int response;
       switch(message) 
       {
       case WM_COMMAND:
          switch(LOWORD(wParam)) 
       {
       case IDM_DIALOG:
             DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG), hwnd, (DLGPROC) DialogFunc);
             break;
          case IDM_EXIT:
             response = MessageBox(hwnd, "Quit the Program?",
                                  "Exit", MB_YESNO);
             if(response == IDYES) PostQuitMessage(0);
             break;
          case IDM_STATUS: /* show check box status */
             if(cbstatusl == BST_CHECKED)
                strcpy(str, "Checkbox 1 is checked\n");
             else strcpy(str, "Checkbox 1 is not checked\n");
             if(cbstatus2 == BST_CHECKED)
                strcat(str, "Checkbox 2 is checked");
             else strcat(str, "Checkbox 2 is not checked");
                MessageBox(hwnd, str, "Status", MB_OK);
             break;
          case IDM_HELP:
             MessageBox(hwnd, "Not Implemented", "Help", MB_OK);
             break;
       }
       break;
       case WM_DESTROY: /* terminate the program */
          PostQuitMessage(0);
          break;
       default:
          /* Let Windows 98 process any messages not specified in
             the preceding switch statement. */
          return DefWindowProc(hwnd, message, wParam, lParam);
       }
       return 0;
    }
       
       /* A simple dialog function. */
    LRESULT CALLBACK DialogFunc(HWND hdwnd, UINT message,
                            WPARAM wParam, LPARAM lParam)
    {
       switch(message) 
       {
       case WM_COMMAND:
          switch(LOWORD(wParam)) 
       {
          case IDCANCEL:
             EndDialog(hdwnd, 0);
             return 0;
          case IDOK:
       
        /* update global checkbox status variables */
             cbstatusl = SendDlgItemMessage(hdwnd, ID_CB1,
                            BM_GETCHECK, 0, 0);
             cbstatus2 = SendDlgItemMessage(hdwnd, ID_CB2,
                            BM_GETCHECK, 0, 0);
             EndDialog(hdwnd, 0);
             return 1;
          case ID_CB1:
             /* user selected 1st check box, so check it */
             SendDlgItemMessage(hdwnd, ID_CB1,
                         BM_SETCHECK, BST_CHECKED, 0);
             return 1;
          }
       }
       return 0;
    }