#include <Windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("HexCalc");
MSG msg;
HWND hwnd;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
//注册自己的对话框时,所必须的
wndclass.cbWndExtra=DLGWINDOWEXTRA;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(hInstance,szAppName);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateDialog(hInstance,szAppName,0,NULL);
ShowWindow(hwnd,iCmdShow);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void ShowNumber(HWND hwnd,UINT iNumber)
{
TCHAR szBuffer[20];
wsprintf(szBuffer,TEXT("%X"),iNumber);
//VK_ESCAPE是什么意思
SetDlgItemText(hwnd,VK_ESCAPE,szBuffer);
}
DWORD CalcIt(UINT iFirstNum,int iOperatation,UINT iNum)
{
switch(iOperatation)
{
case '=':return iNum;
case '+':return iFirstNum+iNum;
case '-':return iFirstNum-iNum;
case '*':return iFirstNum*iNum;
case '&':return iFirstNum&iNum;
case '|':return iFirstNum|iNum;
case '^':return iFirstNum^iNum;
case '<':return iFirstNum<<iNum;
case '>':return iFirstNum>>iNum;
case '/':return iNum?iFirstNum/iNum:MAXDWORD;
case '%':return iNum?iFirstNum%iNum:MAXDWORD;
default:return 0;
}
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static BOOL bNewNumber=TRUE;
static int iOperation='=';
static UINT iNumber,iFirstNum;
HWND hButton;
switch(message)
{
//下面的很多都没有加break,直接顺序执行下去,注意顺序不能改
//当按下一个按键时,会触发三个消息WM_KEYDOWN,WM_CHAR,WM_KEYUP
//当按下的不是方向左键时,系统就不处理WM_KEYDOWN消息,直接break,处理WM_CHAR消息
case WM_KEYDOWN:
//如果按下键盘左方向键,就相当于是VB_BACK,减去最后一位
if(wParam!=VK_LEFT)
break;
wParam=VK_BACK;
//所有字符都先通过CharUpper转换成大写
case WM_CHAR:
//判断是不是回车
if((wParam=(WPARAM)CharUpper((TCHAR*)wParam))==VK_RETURN)
wParam='=';
//通过键盘按键来判断是哪一个,来实现相应的动画效果
//如无相对应的,则发出警告
if(hButton=GetDlgItem(hwnd,wParam))
{
SendMessage(hButton,BM_SETSTATE,1,0);
Sleep(100);
SendMessage(hButton,BM_SETSTATE,0,0);
}
else
{
MessageBeep(0);
break;
}
//上面的键盘按键会把hwnd传递到下面
//下面就是鼠标点击的实现了
case WM_COMMAND:
//设置焦点
SetFocus(hwnd);
//BACK的处理
if(LOWORD(wParam)==VK_BACK)
//十六进制的,就要除以16
ShowNumber(hwnd,iNumber/=16);
//Equals的处理
else if(LOWORD(wParam)==VK_ESCAPE)
ShowNumber(hwnd,iNumber=0);
//判断是不是数字
else if(isxdigit(LOWORD(wParam)))
{
//判断是第几个数字
if(bNewNumber)
{
iFirstNum=iNumber;
iNumber=0;
}
bNewNumber=FALSE;
//只做4位的处理?
if(iNumber<=MAXDWORD>>4)
ShowNumber(hwnd,iNumber=16*iNumber+wParam-(isdigit(wParam)? '0':'A'-10));
else
MessageBeep(0);
}
else
{
//输入的是第二个数字,就调用CalcIt来计算
//不是的话,下面就是设置标志位,读入操作符
if(!bNewNumber)
ShowNumber(hwnd,iNumber=CalcIt(iFirstNum,iOperation,iNumber));
bNewNumber=TRUE;
iOperation=LOWORD(wParam);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
第一次直接在WinMain中调用对话框,这种方式以后应该会经常用到的,处理方式会在以后经常用到。
完成了这个了,今天其它事情就是做个小程序,测试一下昨天到的三个摄像头能否同时工作,图像处理啊~~~~。
最近学了Windows程序了,直接用Windows API来实现,不再用那繁琐的MFC了,还是喜欢自己能把控的代码。