小弟初涉MFC宝地,哪里知道MFC非常的复杂,包含的东西暴多,另外每个基类的构造又封装太多的东西使的小弟看了混乱,再也没有从main->查看函数->数据结构等反复查找,至少还有头绪的c代码那种了,至少代码整个流程很好理解。由于MFC是事件驱动,以及消息传递模式的。里面有很多花头,比如消息映射等,MFC 巨集
等,由于最近老板让我看一个已经完成的产品代码,让我以来学习以下,二来找以下bug,可是小生刚刚学校毕业,涉世未生,程序由MFC以及c++混合的,我看了好几天还是没有把程序的整个框架给看懂,甚至那些消息都是被集合在一个BEGIN——MESSAGE——MAP和END_MESSAGE_MAP当中的,我不知道什么时候调用的。我也看了深入浅出MFC以及MFC相关书籍但是效率还是不是很高。不能一下子理解整个框架,问了几个对MFC的同事,他们也是跟我粗略的讲了以下“只要知道消息是怎么传送的就可以了”可是没看会整个框架如何谈到消息呢?因为是工作,不可能让你读完一本MFC书再让你看代码的,再说这也不针对目标。我的思路是首先理解vc6和mfc整个程序的大致框架->画出程序大致流程(消息传递)->再去看每个功能的实现细节->查找bug->写mfc代码->more..这里我就要请教那些以前也从不会mfc到现在的熟练,可以自己完整开发mfc程序的有经验的朋友了,像我这种情况应该怎么去熟悉mfc和老板叫给我的任务呢?以及你们以前在不懂mfc的时候是如何去理解程序大致框架的呢?请高手拉初学者一把。感谢!如有相关文章以及好的书籍请发到我的邮箱中,email:[email protected]

解决方案 »

  1.   

    BEGIN——MESSAGE——MAP和END_MESSAGE_MAP
    中间定义消息处理的函数大概理解其中各条消息在什么时候会产生,以及对各条消息有什么处理就大概可以明白程序的结构了。具体一条消息是在什么时候会产生……这个不看书不看帮助没有办法。
    例如MFC的WM_CREATE消息在窗口创建的时候产生,
    而BE_CLICK消息则在一个可以click的物件被click的时候产生。
    具体什么消息、什么时候产生、默认有什么处理,还是去查书好了。还要注意消息是否是程序自己创建的,如果是,就要看程序中具体创建的位置。
      

  2.   

    你按Ctrl+W,看看Class Wizard,然后找到一些消息或某个按钮的BN_CLICKED的消息,找到一些VB或Delphi点鼠标写程序的感觉,兴许你就可以慢慢的习惯了,然后有一点,要安装MSDN,有问题按F1看帮助,多看有益,要学会使用MSDN了解和解决未知的问题。
      

  3.   

    你按Ctrl+W,看看Class Wizard,然后找到一些消息或某个按钮的BN_CLICKED的消息,找到一些VB或Delphi点鼠标写程序的感觉,兴许你就可以慢慢的习惯了,然后有一点,要安装MSDN,有问题按F1看帮助,多看有益,要学会使用MSDN了解和解决未知的问题。
      

  4.   

    俺也是初学者,原来因为公司业务需要,在dos下用borlandc++3.1,现在公司要做一个新业务,用vc,我是边学边用已经近半年了,但总感觉用着不爽。越学越多,mfc太庞大了,有点吃不消的感觉。但我发誓一定要把它学好!!说真的,至今我对vc的消息机制还是一知半解。真的好难呀!我的qq是179987997,希望有爱好vc的朋友共同交流,共同提高!
      

  5.   

    把候捷的《深入浅出MFC》从头到尾看完,就应该入门了
      

  6.   

    >BEGIN——MESSAGE——MAP和END_MESSAGE_MAP>把候捷的《深入浅出MFC》从头到尾看完,就应该“对MFC”入门了
      

  7.   

    候捷的《深入浅出MFC》第三章有谁能看懂?
      

  8.   

    我想要是真的想很清楚的了解mfc,还是学学api吧。c++就不用说了。那是最根本的。api可以让你明白mfc里的各种机理。
      

  9.   

    GENERIC.C contains code for the GENERIC application. It includes GENERIC.H./********************************************************************\
    *  generic.c: Source code for generic                                *
    *                                                                    *
    *  Comments: Generic Win32-based Application                         *
    *                                                                    *
    *  Functions:                                                        *
    *     WinMain      - Application entry point                         *
    *     MainWndProc  - main window procedure                           *
    *     AboutDlgProc - dialog procedure for About dialog               *
    *                                                                    *
    *                                                                    *
    \********************************************************************//*********************  Header Files  *********************/#include <windows.h>
    #include "generic.h"/*********************  Prototypes  ***********************/LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM );
    LRESULT WINAPI AboutDlgProc( HWND, UINT, WPARAM, LPARAM );/*******************  Global Variables ********************/HANDLE ghInstance;/********************************************************************\
    *  Function: int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int)    *
    *                                                                    *
    *   Purpose: Initializes Application                                 *
    *                                                                    *
    *  Comments: Register window class, create and display the main      *
    *            window, and enter message loop.                         *
    *                                                                    *
    *                                                                    *
    \********************************************************************/int PASCAL WinMain( HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpszCmdLine,
        int nCmdShow )
    {
       WNDCLASS wc;
       MSG msg;
       HWND hWnd;   if( !hPrevInstance )
       {
          wc.lpszClassName = "GenericAppClass";
          wc.lpfnWndProc = MainWndProc;
          wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
          wc.hInstance = hInstance;
          wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
          wc.hCursor = LoadCursor( NULL, IDC_ARROW );
          wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+1 );
          wc.lpszMenuName = "GenericAppMenu";
          wc.cbClsExtra = 0;
          wc.cbWndExtra = 0;      RegisterClass( &wc );
       }   ghInstance = hInstance;   hWnd = CreateWindow( "GenericAppClass",
          "Generic Application",
          WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
          0,
          0,
          CW_USEDEFAULT,
          CW_USEDEFAULT,
          NULL,
          NULL,
          hInstance,
          NULL
       );   ShowWindow( hWnd, nCmdShow );   while( GetMessage( &msg, NULL, 0, 0 ) ) {
          TranslateMessage( &msg );
          DispatchMessage( &msg );
       }   return msg.wParam;
    }/********************************************************************\
    * Function: LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM) *
    *                                                                    *
    *  Purpose: Processes Application Messages                           *
    *                                                                    *
    * Comments: The following messages are processed                     *
    *                                                                    *
    *           WM_PAINT                                                 *
    *           WM_COMMAND                                               *
    *           WM_DESTROY                                               *
    *                                                                    *
    *                                                                    *
    \********************************************************************/LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam,
       LPARAM lParam )
    {
       PAINTSTRUCT ps;
       HDC hDC;   switch( msg ) {/**************************************************************\
    *     WM_PAINT:                                                *
    \**************************************************************/      case WM_PAINT:
             hDC = BeginPaint( hWnd, &ps );         TextOut( hDC, 10, 10, "Hello, World!", 13 );         EndPaint( hWnd, &ps );
             break;/**************************************************************\
    *     WM_COMMAND:                                              *
    \**************************************************************/      case WM_COMMAND:
             switch( wParam ) {
                case IDM_ABOUT:
                   DialogBox( ghInstance, "AboutDlg", hWnd, (DLGPROC)
                              AboutDlgProc );
                break;
             }
          break;/**************************************************************\
    *     WM_DESTROY: PostQuitMessage() is called                  *
    \**************************************************************/      case WM_DESTROY:
             PostQuitMessage( 0 );
             break;/**************************************************************\
    *     Let the default window proc handle all other messages    *
    \**************************************************************/      default:
             return( DefWindowProc( hWnd, msg, wParam, lParam ));
       }   return 0;
    }/********************************************************************\
    * Function: LRESULT CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM)*
    *                                                                    *
    *  Purpose: Processes "About" Dialog Box Messages                    *
    *                                                                    *
    * Comments: The About dialog box is displayed when the user clicks   *
    *           About from the Help menu.                                *
    *                                                                    *
    \********************************************************************/LRESULT CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
       switch( uMsg ) {
          case WM_INITDIALOG:
             return TRUE;
          case WM_COMMAND:
             switch( wParam ) {
                case IDOK:
                   EndDialog( hDlg, TRUE );
                   return TRUE;
             }
          break;
       }   return FALSE;
    }