共有回帖数 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 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知