1. 程式人生 > >有時候一個小例子就可以理解MFC。

有時候一個小例子就可以理解MFC。

//#ifdef _WIN32_WINNT
//#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
//#endif


#include <windows.h>
#include <stdio.h>
//#if (_WIN32_WINNT >= 0x0500)
#define TIMER_ONE_SECOND  500
#define RED_LAMP_TIMER    1


/*窗體過程處理函式的宣告*/
LRESULT CALLBACK WinProc(
                            HWND hwand,        // handle to window
                            UINT uMsg,         // message identifier
                            WPARAM wParam,     // first message parameter
                            LPARAM lParam      // second message parameter
                            );


int WINAPI WinMain
(
    HINSTANCE hInstance,       // handle to current instance
    HINSTANCE hPrevInstance,   // handle to previous instance
    LPSTR lpCmdLine,           // command line
    int nCmdShow               // show state
 )
{
    static TCHAR szAppName[] = "WinClassName";


    //第一步驟:窗體類設計
//design a window class
    WNDCLASS wndclass;
    HWND hwnd;
    MSG msg;


    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wndclass.hCursor = LoadCursor(NULL,IDC_CROSS);
    wndclass.hIcon = LoadIcon(NULL,IDI_ERROR);
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WinProc;
    wndclass.lpszClassName = szAppName;
    wndclass.lpszMenuName = NULL;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    //窗體類註冊
    RegisterClass(&wndclass);
 
//第二步驟:窗體顯示
    hwnd = CreateWindow(szAppName,"Windows Example",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
    ShowWindow( hwnd,SW_SHOWNORMAL );
    UpdateWindow( hwnd );
    SetTimer(hwnd,RED_LAMP_TIMER,500,NULL);
    
//第三步驟:訊息迴圈
    //define message
    while( GetMessage( &msg, NULL, 0, 0))
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
    return msg.wParam;
}


LRESULT CALLBACK WinProc(
                            HWND hWnd,       // handle to window
                            UINT uMsg,       // message identifier
                            WPARAM wParam,   // first mesage parameter
                            LPARAM lParam    // second message parameter
                            )
{
    HDC hDC;
    PAINTSTRUCT ps;
 //   int n = 5;
    char szChar[20];
    static BOOL bLight = TRUE;
    int nPosX = 20;
    int nPosY = 50;
    int nRad = 20;
    HBRUSH obj;
    HBRUSH OldObj;
    RECT rect;

    switch( uMsg )
    {
   case WM_TIMER:
        bLight = !bLight;
      //  GetClientRect(hWnd,&rect);
GetWindowRect(hWnd,&rect); 
        InvalidateRect(hWnd, NULL, TRUE);

        break;
 
   case WM_PAINT:
        hDC = BeginPaint( hWnd, &ps );
        TextOut( hDC, 0, 0, "Windows Example", strlen("Windows Example"));
        if(bLight)
        {

            //obj = (HBRUSH)GetStockObject(GRAY_BRUSH);
            SelectObject(hDC,GetStockObject(DC_BRUSH));
            SetDCBrushColor(hDC,RGB(0x00,0xff,0x00));
            //OldObj = SelectObject(hDC, obj);
            Ellipse(hDC,nPosX-nRad,nPosY-nRad,nPosX+nRad,nPosY+nRad);
        }
        else
        {
            obj = (HBRUSH)GetStockObject(BLACK_BRUSH);
            OldObj = SelectObject(hDC, obj);
            Ellipse(hDC,nPosX-nRad,nPosY-nRad,nPosX+nRad,nPosY+nRad);

        }
SelectObject(hDC, OldObj);

        EndPaint(hWnd,&ps);
        break;
    case WM_CHAR:
{
        sprintf( szChar, "char code is %d", wParam);
        MessageBox( hWnd, szChar, "char", 0 );
        break;
}
    case WM_LBUTTONDOWN:
        MessageBox( hWnd, "mouse clicked", "message", 0);
break;


    case WM_CLOSE:
        if( IDYES == MessageBox(hWnd, "Do you really want to exit this program [y/n]?","message", MB_YESNO) )
        {
            DestroyWindow( hWnd );
        }
        break;
 
    case WM_DESTROY:
        PostQuitMessage( 0 );
    default:
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
;
    }
    return 0;
}