新建一个工程,安装MSDN文档
File -new - win32application- a simple win32 app
Dos操作系统是 16位操作系统 2^16=65535 ,内存为16k
win32操作系统(window95以后的系统) 32位 2^32 内存约为4G
进入后可以试着编译运行这样一段话
tip:选中MessageBox 按F1可以看到MSDN的相关文档, 选中MB_OK 按F12可以看到它的宏定义
int MessageBox( HWND hWnd, // handle to owner window LPCTSTR lpText, // text in message box LPCTSTR lpCaption, // message box title UINT uType // message box style );
uint uType 定义了按钮图标的方式,可以位组合,详见MSDN文档
HWND hWnd 是定义消息框的父窗口 可以用FindWindow来找需要附加的父窗口
messagebox有返回值,可以通过返回值来判断用户点了哪个按钮
int entry=MessageBox(NULL,"A new win32 app","hello~",MB_YESNOCANCEL);//提示内容,提示 if(entry==IDYES) { MessageBox(NULL,"YES","你点击了:",MB_OK); } else if(entry==IDNO) { MessageBox(NULL,"NO","你点击了:",MB_OK); } else { MessageBox(NULL,"CANCEL","你点击了:",MB_OK); }
进入目录后可以看到以下文件:
.cpp源代码文件
.dsp vc开发环境生成的工程文件,文本格式
.dsw vc开发环境生成的项目文件,用来把多个工程组织到一个项目中,文本格式
.dat data的简写,用来保存工程中的数据
.ncb “No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息
.plg 是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件)
进入debug后有
.ilk 连接过程中生成的一种中间文件,只供LINK工具使用
.obj 是目标文件,一般是程序编译后的二进制文件,在通过链接器和资源文件链接就成exe文件了。OBJ只给出了程序的相对地址,而EXE是绝对地址。
.pch 是预编译头文件的后缀名,可以加快编译速度
.idb 一种 MSDev 中间层文件
.pdb 一种 3Com PalmPilot 数据库文件
.pbd 一种 PowerBuilder 动态库,作为本地DLL的一个替代物
tip:vc6.0文件打开奔溃的问题见
http://blog.csdn.net/makenothing/article/details/8677682
http://blog.csdn.net/beyond_cn/article/details/20305877
2015-4-27
在现有工程上添加资源脚本文件(图标、光标、对话框、快捷键等)
选中工程- new -File- Resource Script
在刚才建的资源脚本文件中 插入图标icon等
如果有多个图标,ID最小的图标会被作为应用程序的图标
开发一个对话框程序
在刚才建的资源脚本文件中 插入对话框Dialog
设置对话框字体:
选中对话框-右键选择property- 选择字体 如微软雅黑 10 , 带@的是竖直方向的字体,不带@的是水平方向的字体
在主函数中调用对话框程序
DialogBox
INT_PTR DialogBox( HINSTANCE hInstance, // handle to module LPCTSTR lpTemplate, // dialog box template HWND hWndParent, // handle to owner window DLGPROC lpDialogFunc // dialog box procedure );
第一个参数是对话框的句柄,有了句柄就可以对对话框执行任何操作
第二个参数是指定对话框ID,要包含resouse.h 使得对话框ID可见
第三个参数的父窗口ID,没有为NULL
第四个参数的指定消息回调函数的地址,消息回调函数是用来截获输入的信息
消息=消息ID+附带数据
回调函数:
INT_PTR CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter );
WM_COMMAND
This message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
WM_COMMAND wNotifyCode = HIWORD(wParam); wID = LOWORD(wParam); hwndCtl = (HWND) lParam;
wParam和lParam都是四个字节的变量
lParam记录点击按钮后产生的句柄
wParam 分为HIWORD和LOWWORD两部分,
高两位记录按下快捷键时产生的消息(记为1),或者是菜单上的按钮(记为0)
低两位记录按钮、菜单项、快捷键的编号
EndDialog
The EndDialog function destroys a modal dialog box, causing the system to end any processing for the dialog box.
BOOL EndDialog( HWND hDlg, // handle to dialog box INT_PTR nResult // value to return );
WM_COMMAND==uMsg表示该消息是命令消息,然后再进一步进行区分
#include "stdafx.h" #include "resource.h" BOOL CALLBACK MainProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { if(WM_COMMAND==uMsg) { if(LOWORD(wParam)==IDCANCEL) { EndDialog(hwndDlg,IDCANCEL); } } return FALSE; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance,(LPCSTR)IDD_DIALOG1,NULL,MainProc); return 0; }
tip:如果控件栏不见了, 在vc6的窗口上右键->controls
读取对话框数据,输出数据到对话框
GetDlgItemInt
This function translates the text of a specified control in a dialog box into an integer value.
UINT GetDlgItemInt( HWND hDlg, 指定对话框句柄 int nIDDlgItem, 指定需要转换的文本框ID BOOL *lpTranslated, BOOL bSigned); 输入是否要转为正数
SetDlgItemInt
This function sets the text of a control in a dialog box to the string representation of a specified integer value.
BOOL SetDlgItemInt( HWND hDlg, int nIDDlgItem, UINT uValue, 要输出的值 BOOL bSigned); 输出是否要转问正数
tip:IDC是 控件ID,control , IDD是对话框ID, dialog
window的变量类型
1.简单重定义。所有L开头的变量是window对c语言变量的简单重定义
BOOL, BYTE, INT, UINT, LPARAM
2.句柄类型。所有H开头的变量是window的句柄变量
HWND, HINSTANCE, HICON
3.结构体类型。
POINT, SIZE, RECT
if(WM_COMMAND==uMsg) { if(LOWORD(wParam)==IDCANCEL) { EndDialog(hwndDlg,IDCANCEL); return TRUE; } if(LOWORD(wParam)==IDOK) { int left=GetDlgItemInt(hwndDlg,IDC_LEFT,NULL,TRUE); int right=GetDlgItemInt(hwndDlg,IDC_RIGHT,NULL,TRUE); int result=left+right; SetDlgItemInt(hwndDlg,IDC_RESULT,result,TRUE); } }
----------------------------------------------华丽的分割线--------------------------------------------------------
建立MFC窗体程序
http://wenku.baidu.com/view/2c1dcf533c1ec5da50e27018.html
http://www.cnblogs.com/moondark/p/4147187.html
添加菜单栏
选择工程-插入-资源-menu 然后在窗体属性中选择这个新建的menu
动态添加菜单栏http://www.cnblogs.com/mx113/archive/2009/12/05/1617678.html
选中menu- 右键-建立类向导 http://blog.sina.com.cn/s/blog_69e905cd0100kghw.html
打开bmp文件:
void CBMPALGORITHMDlg::OnMenuopen() { // TODO: Add your command handler code here char szFilter[]="BMP Files (*.bmp)|*.bmp|All Files(*.*)|*.*||"; CFileDialog dlg( TRUE,"BMP",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter ); if(dlg.DoModal() == IDOK) { CString strPathName = dlg.GetPathName(); SetDlgItemText(IDC_OUTPUT,strPathName);//输出路径 MessageBox("ok","hi~",MB_OK); } }
文件过滤:
char szFilter[]="BMP Files (*.bmp)|*.bmp|All Files(*.*)|*.*||";
CFileDialog
CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL);