今天再重头来看MFC,为的是完成一个软件。好久没有做了,已经找不到头绪了。所以重头温习一下MFC。
采用RadAsm这个编辑器来做吧!
首先建立了一个cpp的应用程序,居然发现了,其中有很多的问题。
如(1)不支持菜单
(2)不支持标准的c库
(3)没有窗口的重绘处理部分
这样的模板对于初学者来说太难了吧!算了,改改吧!
打开模板文件,按照说明,进行修改。
首先修改编译的设置,原来的模板在发行模式下是不支持资源的,要支持资源只需要修改
13=5,O,$B/LINK @libs.txt /SUBSYSTEM:WINDOWS /DEBUG /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3
为13=5,O,$B/LINK @libs.txt /SUBSYSTEM:WINDOWS /DEBUG /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3,4
这样就支持资源了,当然支持菜单了。
删除原来模板中的
#pragma comment(linker, "/ENTRY:EntryPoint")
使其支持标准的输入输出库stdio.h
添加代码:
HDC hdc;
PAINTSTRUCT ps;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
//在这里添加绘制窗口代码
EndPaint(hwnd,&ps);
return 0;
最后为了完善这个模板,干脆再加入对WM_COMMAND的处理。
好了,下面是最终的模板代码部分内容:
Win32 App
test
Window app
[*BEGINPRO*]
[*BEGINDEF*]
[MakeDef]
Menu=0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0
1=4,O,$D/RC /v,1
2=3,O,$B/CL /c /O1 /GA /GB /w /TC /nologo /Zi /Fo /I"$I",2
3=5,O,$B/LINK @libs.txt /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3,4
4=0,0,,5
5=rsrc.obj,O,$B/CVTRES,rsrc.res
6=*.obj,O,$B/CL /c /O1 /GA /GB /w /TC /nologo /Fo /I"$I",*.cpp
7=0,0,"$E/OllyDbg",5
11=4,O,$D/RC /v,1
12=3,O,$B/CL /c /O1 /GA /GB /w /TC /nologo /Zi /Fo /I"$I",2
13=5,O,$B/LINK @libs.txt /SUBSYSTEM:WINDOWS /DEBUG /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3,4
14=0,0,,5
15=rsrc.obj,O,$B/CVTRES,rsrc.res
16=*.obj,O,$B/CL /c /O1 /GA /GB /w /TC /nologo /Fo /I"$I",*.cpp
17=0,0,"$E/OllyDbg",5
[MakeFiles]
0=test.rap
1=test.rc
2=test.cpp
3=test.obj
4=test.res
5=test.exe
6=test.def
7=test.dll
8=test.txt
9=test.lib
10=test.mak
11=test.c
12=test.com
13=test.ocx
14=test.idl
15=test.tlb
[Resource]
[StringTable]
[Accel]
[VerInf]
[Group]
Group=Added files,Assembly,Resources,Misc,Modules
1=2
2=2
3=
[*ENDDEF*]
[*BEGINTXT*]
test.cpp
#include "windows.h"
#include "test.h"
//#pragma comment(linker, "/ENTRY:EntryPoint")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void EntryPoint()
{
ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[]=TEXT("Windows");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbCl***tra=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.lpszMenuName=(LPCSTR)IDR_MENU;//如果要使用菜单,修改这里,IDR_MENU是你的菜单的名字。
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName, //window class name
TEXT("Windows Program"), //window caption
WS_OVERLAPPEDWINDOW, //window style
CW_USEDEFAULT, //initial x position
CW_USEDEFAULT, //initial y position
CW_USEDEFAULT, //initial x size
CW_USEDEFAULT, //initial y size
NULL, //parent window handle
NULL, //window menu handle
hInstance, //program instance handle
NULL); //creation parameters
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmID,wmEvent;
HDC hdc;
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:
//Put your code here
return 0;
case WM_COMMAND:
wmID=LOWORD(wParam);
wmEvent=HIWORD(wParam);
switch(wmID)
{
//在这里添加你的命令处理代码
}
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
//在这里添加绘制窗口代码
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
[*ENDTXT*]
[*BEGINTXT*]
libs.txt
kernel32.lib
comctl32.lib
user32.lib
gdi32.lib
comdlg32.lib
shell32.lib
winmm.lib
[*ENDTXT*]
[*ENDPRO*]
转载于:https://www.cnblogs.com/jh0262/archive/2007/03/13/2946853.html