签到

06月21日
尚未签到

共有回帖数 0

    战神

    等级:
    我将前面我改写的windowsAPI进行了类封装,仿MFC的结构:
    如下:
    首先:步骤同建立windowsAPI(http://post.baidu.com/f?kz=259127458)
    然后:第4步输入的源代码更改为如下:
    //消息类----------------------------------------------------
    class CCmdTarget
    {
    public:
    LRESULT CALLBACK AfxWndProc(HWND hwnd,UINT message,
    WPARAM wParam,LPARAM lParam);
     
    CCmdTarget();
    virtual void OnInputLangChange(WPARAM);
    virtual void OnCreate(HDC);
    virtual void OnSize(UINT,LPARAM,HWND);
    virtual void OnSetFocus(HWND);
    virtual void OnKillFocus(HWND);
    virtual void OnKeyDown(WPARAM wParam);
    void OnChar(WPARAM,LPARAM,HWND);
    void OnDraw(HDC hdc);
    virtual void OnDestroy();
    private:
    DWORD dwCharSet;
    int cxChar,cyChar,cxClient,cyClient,cxBuffer,cyBuffer,xCaret,yCaret;
    TCHAR * pBuffer;
    int Order,bOutWhile;
    HDC hdc;
    int x,y,i;
    PAINTSTRUCT ps;
    TEXTMETRIC tm;
    int Direction,WinFlag;
    };
    //窗口类CCmdTarget的析构函数------------------------------------
    CCmdTarget::CCmdTarget()
    {
    dwCharSet=DEFAULT_CHARSET;
    pBuffer=NULL;
    Order=CHESS1;
    bOutWhile=WINFALSE;
    WinFlag=WINFALSE;
    }
    //真正的窗口函数------------------------------------------------
    LRESULT CALLBACK CCmdTarget::AfxWndProc(HWND hwnd,  
    UINT message,  
    WPARAM wParam,  
    LPARAM lParam)
    {
     
    switch(message)
    {
    case WM_INPUTLANGCHANGE:
    OnInputLangChange(wParam);
    break;
    case WM_CREATE:
    hdc=GetDC(hwnd);
    OnCreate(hdc);
    ReleaseDC(hwnd,hdc);
    break;
    case WM_SIZE:
    OnSize(message,lParam,hwnd);
    break;
    case WM_SETFOCUS:
    OnSetFocus(hwnd);
    break;
    case WM_KILLFOCUS:
    OnKillFocus(hwnd);
    break;
    case WM_KEYDOWN:
    OnKeyDown(wParam);
    break;
    case WM_CHAR:
    OnChar(wParam,lParam,hwnd);
    break;
    case WM_PAINT:
    hdc=BeginPaint(hwnd,&ps);
    OnDraw(hdc);
    EndPaint(hwnd,&ps);
    SetCaretPos(xCaret * cxChar, yCaret * cyChar);
    break;
    case WM_DESTROY:
    OnDestroy();
    break;
    }

    return DefWindowProc(hwnd,message,wParam,lParam);
    }
    //------------------------------------------------------
    void CCmdTarget::OnInputLangChange(WPARAM wParam)
    {
    dwCharSet=wParam;
    }

    //WM_CREATE消息处理--------------------------------------
    void CCmdTarget::OnCreate(HDC hdc)
    {
    SelectObject(hdc,CreateFont(0,0,0,0,0,0,0,0,
    dwCharSet,0,0,0,FIXED_PITCH,NULL));

    GetTextMetrics(hdc,&tm);
    cxChar=tm.tmAveCharWidth;
    cyChar=tm.tmHeight;

    DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));

    cxBuffer=max(1,19);
    cyBuffer=max(1,19);

    if(pBuffer!=NULL)
    free(pBuffer);

    pBuffer=(TCHAR *)malloc(cxBuffer *cyBuffer *sizeof(TCHAR));

    for(y=0;ycyBuffer;y++)
    for(x=0;xcxBuffer;x++)
    BUFFER(x,y)=CHESSNULL;

    xCaret=0;
    yCaret=0;
    }
    //WM_SIZE消息处理--------------------------------------
    void CCmdTarget::OnSize(UINT message,LPARAM lParam,HWND hwnd)
    {
    if(message==WM_SIZE)
    {
    cxClient=LOWORD(lParam);
    cyClient=HIWORD(lParam);
    }

    if(hwnd==GetFocus())
    SetCaretPos(xCaret*cxChar,yCaret*cyChar);

    InvalidateRect(hwnd,NULL,TRUE);
    }
    //WM_SETFOCUS消息处理--------------------------------------
    void CCmdTarget::OnSetFocus(HWND hwnd)
    {
    CreateCaret(hwnd,NULL,cxChar,cyChar);
    SetCaretPos(xCaret*cxChar,yCaret*cyChar);
    ShowCaret(hwnd);
    }
    //WM_KILLFOCUS消息处理--------------------------------------
    void CCmdTarget::OnKillFocus(HWND hwnd)
    {
    HideCaret(hwnd);
    DestroyCaret();
    }
    //WM_KEYDOWN消息处理--------------------------------------
    void CCmdTarget::OnKeyDown(WPARAM wParam)
    {
    switch(wParam)
    {
    case VK_LEFT:
    if(Order==CHESS2)
    xCaret=max(xCaret-1,0);
    break;
    case VK_RIGHT:
    if(Order==CHESS2)
    xCaret=min(xCaret+1,cxBuffer-1);
    break;
    case VK_UP:
    if(Order==CHESS2)
    yCaret=max(yCaret-1,0);
    break;
    case VK_DOWN:
    if(Order==CHESS2)
    yCaret=min(yCaret+1,cyBuffer-1);
    break;
    case VK_DELETE://退棋
    break;
    }
    SetCaretPos(xCaret *cxChar,yCaret*cyChar);
    }
    //WM_CHAR消息处理--------------------------------------
    void CCmdTarget::OnChar(WPARAM wParam,LPARAM lParam,HWND hwnd)
    {
    int i;
    for(i=0;i(int)LOWORD(lParam);i++)
    {
    switch(wParam)
    {
    case 'w'://UP
    case 'W':  
    if(Order==CHESS1)
    yCaret=max(yCaret-1,0);
    break;
    case 's'://DOWN  
    case 'S':
    if(Order==CHESS1)
    yCaret=min(yCaret+1,cyBuffer-1);
    break;
    case 'a'://LEFT  
    case 'A':
    if(Order==CHESS1)
    xCaret=max(xCaret-1,0);
    break;
    case 'd'://RIGHT
    case 'D':
    if(Order==CHESS1)
    xCaret=min(xCaret+1,cxBuffer-1);
    break;
    case ' ':
    case 'r'://落子
    if(!((Order==CHESS2&&wParam=='r')||(Order==CHESS1&&wParam==' ')))
    {
    //DoError();
    PlaySound(TEXT("DoError.wav"),NULL,SND_FILENAME|SND_ASYNC);
    break;
    }

    if(BUFFER(xCaret,yCaret)==CHESSNULL)
    {
    BUFFER(xCaret,yCaret)=Order;
    HideCaret(hwnd);
    hdc=GetDC(hwnd);

    SelectObject(hdc,CreateFont(0,0,0,0,0,0,0,0,
    dwCharSet,0,0,0,FIXED_PITCH,NULL));

    TextOut(hdc,xCaret * cxChar,yCaret * cyChar,
    &BUFFER(xCaret,yCaret),1);

    SetTextAlign(hdc,TA_LEFT|TA_TOP);

    DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));


    ReleaseDC(hwnd,hdc);

    ShowCaret(hwnd);

    PlaySound(TEXT("DoOk.wav"),NULL,SND_FILENAME|SND_ASYNC);//DoOk();
    for(Direction=0;Direction4&&!WinFlag;Direction++)
    {
    int i;
    int pos_x,pos_y,dpos_x,dpos_y;
    const int testnum=5;
    int count;

    switch(Direction)
    {
    case 0:/*在水平方向*/
    pos_x=xCaret-(testnum-1);
    pos_y=yCaret;
    dpos_x=1;
    dpos_y=0;
    break;
    case 1:/*在垂直方向*/
    pos_x=xCaret;
    pos_y=yCaret-(testnum-1);
    dpos_x=0;
    dpos_y=1;
    break;
    case 2:/*在左下至右上的斜方向*/
    pos_x=xCaret-(testnum-1);
    pos_y=yCaret+(testnum-1);
    dpos_x=1;
    dpos_y=-1;
    break;
    case 3:/*在左上至右下的斜方向*/
    pos_x=xCaret-(testnum-1);
    pos_y=yCaret-(testnum-1);
    dpos_x=1;
    dpos_y=1;
    break;
    }
    count=0;
    for(i=0;itestnum*2+1&&!WinFlag;i++)
    {
    if(pos_x=0&&pos_x=18&&pos_y=0&&pos_y=18)
    {
    if(BUFFER(pos_x,pos_y)==Order)
    {
    count++;
    if(count=testnum)
    WinFlag=WINTRUE;
    }
    else
    {
    count=0;
    WinFlag = WINFALSE;
    }
    }
    pos_x+=dpos_x;
    pos_y+=dpos_y;
    }
    }

    if(WinFlag)
    {
    PlaySound(TEXT("DoWin.wav"),NULL,SND_FILENAME|SND_ASYNC);//DoWin();
    }
    else
    {
    if(Order==CHESS1)
    Order=CHESS2;
    else
    Order=CHESS1;
    }
    }
    else
    {
    //DoError();
    PlaySound(TEXT("DoError.wav"),NULL,SND_FILENAME|SND_ASYNC);
    }
    break;
    case 'x1B':
    InvalidateRect(hwnd,NULL,FALSE);
    break;

    default:
    break;
    }
    }

    SetCaretPos(xCaret * cxChar, yCaret * cyChar);
    if(WinFlag)
    {
    MessageBox(NULL,TEXT("Winner"),TEXT("WinInfo"),0);


    if(pBuffer!=NULL)
    free(pBuffer);

    pBuffer=(TCHAR *)malloc(cxBuffer *cyBuffer *sizeof(TCHAR));

    for(y=0;ycyBuffer;y++)
    for(x=0;xcxBuffer;x++)
    BUFFER(x,y)=CHESSNULL;

    xCaret=0;
    yCaret=0;
    InvalidateRect(hwnd,NULL,TRUE);
    }
    }
    //WM_PAINT消息处理--------------------------------------
    void CCmdTarget::OnDraw(HDC hdc)
    {
    int i,j;

    SelectObject(hdc,CreateFont(0,0,0,0,0,0,0,0,
    dwCharSet,0,0,0,FIXED_PITCH,NULL));

    for(i=0;icxBuffer;i++)
    for(j=0;jcyBuffer;j++)
    {
    char k;
    int x,y;
    x=i;
    y=j;

    /*交叉点上是一号玩家的棋子*/
    if(BUFFER(x,y)==CHESS1)
    {
    // hBrush=(HBRUSH)CreateSolidBrush(RGB(0,0,255));
    k=CHESS1;
    }
    /*交叉点上是二号玩家的棋子*/
    else if(BUFFER(x,y)==CHESS2)
    {
    // hBrush=(HBRUSH)CreateSolidBrush(RGB(255,0,0));
    k=CHESS2;
    }
    else  
    {
    // hBrush=(HBRUSH)CreateSolidBrush(RGB(0,255,0));
    k=CROSS;
    }  

    TextOut(hdc,x * cxChar,y * cyChar,&k,1);
    // DeleteObject(hBrush);
    }

    DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));
    /*显示操作键说明*/
    char *Msg[]=
    {
    "Player1 key: ",
    " UP----w ",
    " DOWN--s ",
    " LEFT--a ",
    " RIGHT-d ",
    " DO----space",
    " ",
    "Player2 key: ",
    " UP----up ",
    " DOWN--down ",
    " LEFT--left ",
    " RIGHT-right",
    " DO----ENTER",
    " ",
    "new game: ",
    " ESC ",
    NULL,
    };

    i=0;
    while(Msg!=NULL)
    {
    SetTextAlign(hdc,TA_RIGHT|TA_CENTER);
    TextOut(hdc,25 *2 * cxChar,i* cyChar,Msg,13);
    SetTextAlign(hdc,TA_LEFT|TA_CENTER);
    i++;
    }
    }
    //WM_DESTROY消息处理--------------------------------------

    void CCmdTarget::OnDestroy()
    {
    ::PostQuitMessage(0);
    }

    //=======================================================
    //窗口类:父类是消息处理类--------------------------------
    class CFrameWnd:public CCmdTarget
    {
    public:
    HWND hwnd;
    public:
    int RegisterWindow();
    void Create(LPCTSTR lpClassName,
    LPCTSTR lpWindowName
    );
    void ShowWindow(int nCmdShow);
    void UpdateWindow();
    };

    //注册窗口--------------------------------------------
    int CFrameWnd::RegisterWindow()
    {
    WNDCLASS wndclass;

    wndclass.style=CS_HREDRAW|CS_VREDRAW;
    wndclass.lpfnWndProc=WndProc;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hInstance=hInstance;
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName=NULL;
    wndclass.lpszClassName=szAppName;
    return RegisterClass(&wndclass);
    }

    //创建窗口----------------------------------------------------
    void CFrameWnd::Create(LPCTSTR lpClassName,
    LPCTSTR lpWindowName)
    {
    RegisterWindow();
    hwnd=CreateWindow(szAppName,lpWindowName,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,NULL,hInstance,NULL);
    }
    //显示窗口框架-------------------------------------------
    void CFrameWnd::ShowWindow(int nCmdShow)
    {
    ::ShowWindow(hwnd,nCmdShow);
    }

    //更新窗口客户区-------------------------------------------
    void CFrameWnd::UpdateWindow()
    {
    ::UpdateWindow(hwnd);
    }

    //=========================================================
    //应用程序类----------------------------------------------
    class CWinApp
    {
    public:
    CWinApp *m_pCurrentWinApp;
    CFrameWnd *m_pMainWnd;
    public:
    CWinApp();
    virtual BOOL InitInstance(int nCmdShow);
    int Run();
    };

    //返回应用程序对象的指针-----------------------------------
    CWinApp::CWinApp()
    {
    m_pCurrentWinApp=this;
    }

    //创建窗口类对象,初始化窗口----------------------------------
    BOOL CWinApp::InitInstance(int nCmdShow)
    {
    m_pMainWnd=new CFrameWnd;
    m_pMainWnd-Create(NULL,"5zq_类封装");
    m_pMainWnd-ShowWindow(nCmdShow);
    m_pMainWnd-UpdateWindow();
    return TRUE;
    }

    //消息循环--------------------------------------------------
    int CWinApp::Run()
    {
    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }
    //全局的应用程序对象定义-----------------------------------
    CWinApp theApp;
    //获得全局应用程序对象的指针的全局函数---------------------
    CWinApp *AfxGetApp()
    {
    return theApp.m_pCurrentWinApp;
    }

    //程序的主函数WinMain(...)---------------------------------------

    int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    CWinApp *pApp;

    pApp=AfxGetApp();
    pApp-InitInstance(iCmdShow);

    return pApp-Run();
    }

    //窗口函数WndProc(...)-------------------------------------------
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message ,WPARAM wParam ,LPARAM lParam)
    {
    CWinApp * pApp=AfxGetApp();
    return pApp-m_pMainWnd-AfxWndProc(hwnd,message,wParam,lParam);
    }

    这应该在最前面,百毒给我审核没有了,重新发一下,为防止再次审核,我分2次吧:
    #includewindows.h
    #define BUFFER(x,y) *(pBuffer + y * cxBuffer + x )
    #define CHESSNULL 0 //没有棋子
    #define CHESS1 'O'//一号玩家的棋子
    #define CHESS2 'X'//二号玩家的棋子
    #define CHESSBOARDCROSS '.'
    #define CROSSRU CHESSBOARDCROSS /*右上角点*/
    #define CROSSLU CHESSBOARDCROSS /*左上角点*/
    #define CROSSLD CHESSBOARDCROSS /*左下角点*/
    #define CROSSRD CHESSBOARDCROSS /*右下角点*/
    #define CROSSL CHESSBOARDCROSS /*左边*/
    #define CROSSR CHESSBOARDCROSS /*右边*/
    #define CROSSU CHESSBOARDCROSS /*上边*/
    #define CROSSD CHESSBOARDCROSS /*下边*/
    #define CROSS CHESSBOARDCROSS /*十字交叉点*/
    #define WINTRUE 1
    #define WINFALSE 0  
    static TCHAR szAppName[]=TEXT("5zq");
    MSG msg;
    HINSTANCE hInstance;
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

    完成了从C----C++----WINDOWSAPI----仿MFC,

    真的,好累啊!

    我想这个5子棋程序的改写就先到这里吧,

    这里高人多多多,如果有建议,我再修改吧,先谢了.

    再次感谢,给我加精的吧主,扫鸟,Ureys,...........,  

    哦,对了,特别感谢liupengty的指点,嘿嘿��

    楼主 2016-01-28 13:15 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知