一,Windows编程模型
#include<windows.h>
win32程序实现的功能是创建一个窗口,在窗口响应键盘及鼠标消息
1)winmain函数定义
2)创建一个窗口
3)进行消息循环
4)编写窗口过程函数
初步代码:
#include<windows.h>
//6,处理消息(窗口过程)
LRESULT CALLBACK WindowProc(
HWND hwnd,//消息所属的窗口句柄
UINT uMsg,//具体消息名称 WM_XXX消息名
WPARAM wParam,//键盘附加消息
LPARAM lParam//鼠标附加
) {
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd);//DestroyWindow发送另一个消息WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char buf[1024];
wsprintf(buf, TEXT("X=%d,Y=%d"), xPos, yPos);
MessageBox(hwnd, TEXT("SALLY FACE"), TEXT("鼠标左键按下"), MB_OK);
break; }
case WM_KEYDOWN://键盘
MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
break;
case WM_PAINT://绘图
{
PAINTSTRUCT ps;//绘图结构体
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, TEXT("LORRY"), strlen("LORRY"));
EndPaint(hwnd, &ps);
}
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);//返回值用默认处理方式
}
int WINAPI WinMain(
HINSTANCE hInstance,//应用程序句柄 _In_输入参数
HINSTANCE hPrevInstance,//上一个应用程序句柄,在win32环境下,参数一般为NULL _In_opt_可选输入参数
LPSTR lpCmdLine,
int nShowCmd) //显示命令 最大化,最小化
{
//1,设计窗口
//2,注册窗口
//3,创建窗口
//4,显示和更新
//5,通过循环取消息
//6,处理消息(窗口过程)
//1,设计窗口
WNDCLASS wc;
wc.cbClsExtra = 0;//类的额外内存
wc.cbWndExtra = 0;//窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 如果第一个参数为NULL,代表使用系统提供的光标
wc.hIcon = LoadIcon(NULL, IDI_ERROR);//图标 如果第一个参数为NULL,代表使用系统提供的光标
wc.hInstance = hInstance; //应用程序实例句柄 传入window中的形参即可
wc.lpfnWndProc=WindowProc;//回调函数 窗口过程
wc.lpszClassName = TEXT("WIN");//指定窗口名称
wc.lpszMenuName = NULL;//菜单名称
wc.style = 0;//显示风格 0代表默认风格
//2,注册窗口
RegisterClass(&wc);
//3,创建窗口
HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
/* lpClassName, 类名
lpWindowName, 标题名
dwStyle,WS_OVERLAPPEDWINDOW风格
x, y, 显示坐标 CW_USEDEFAULT 默认值
nWidth, 宽高
nHeight,
hWndParent, 父窗口NULL
hMenu, 菜单NULL
hInstance,实例句柄
lpParam 附加值NULL*/
//4,显示和更新
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
//HWND hwnd;主窗口句柄
//UINT message;具体消息名称
//WPARAM wParam;附加消息 键盘消息
//LPARAM lParam;附加消息 鼠标消息
//DWORD time;消息产生时间
//POINT pt;x y
while (1)
{
/*_Out_ LPMSG lpMsg,消息
_In_opt_ HWND hWnd,捕获窗口,填NULL捕获所有窗口
_In_ UINT wMsgFilterMin,最小和最大的过滤消息 一般为0
_In_ UINT wMsgFilterMax填0表示捕获所有消息*/
if (GetMessage(&msg, NULL, 0, 0) == FALSE)
{
break;
}
//翻译消息
TranslateMessage(&msg);
//不为false分发消息
DispatchMessage(&msg);
}
return 0;
}
效果图:
二,用mfc创建窗口
1,mfc头文件afxwin.h
2,自定义类 继承与CWINAPP应用程序类MyApp app应用程序对象,有且仅有一个
3,程序如果 Initstance
4,入口里创建窗口
5,窗口类MyFrame构造中CFrameWnd
6,MyFrame构造中Create(NULL,标题名称)
7,创建窗口对象
8,显示和更新
9,m_pMainWnd=frame;//保存指向应用程序的主窗口的指针
10,return TRUE
11,对项目进行配置 在共享DLL中使用MFC
#include"mfc.h"
MyApp app;//全局应用程序对象,有且仅有一个
BOOL MyApp::InitInstance()
{
//创建窗口
MyFrame* frame = new MyFrame;
frame->ShowWindow(SW_SHOWNORMAL);
frame->UpdateWindow();
m_pMainWnd = frame;//保存指向应用程序的主窗口指针
return TRUE;//返回正常初始化
}
MyFrame::MyFrame()
{
Create(NULL, TEXT("mfc"));
}
#include<afxwin.h>
class MyApp :public CWinApp {//CWinApp应用程序
public:
//程序入口
virtual BOOL InitInstance();
};
class MyFranme :public CFramcWnd//窗口框架类
{
public:
MyFranme; ();
};
三,消息映射机制
1,声明宏 写到.h中
2,分界宏 写到.cpp中
3,找消息宏写到 分界宏中间
4,把函数原名声明写到.h中
5,函数的实现写到.cpp中
6,鼠标,键盘,绘图
#include"mfc.h"
MyApp app;//全局应用程序对象,有且仅有一个
BOOL MyApp::InitInstance()
{
//创建窗口
MyFrame* frame = new MyFrame;
frame->ShowWindow(SW_SHOWNORMAL);
frame->UpdateWindow();
m_pMainWnd = frame;//保存指向应用程序的主窗口指针
return TRUE;//返回正常初始化
}
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN()//鼠标左键按下
ON_WM_CHAR()//键盘按下
ON_WM_PAINT()//绘图
END_MESSAGE_MAP()
MyFrame::MyFrame()
{
Create(NULL, TEXT("mfc"));
}
void MyFrame::OnLButtonDown(UINT, CPoint point) {
/*TCHAR buf[1024];
wsprintf(buf, TEXT("x=%d,y=%d"), point.x, point.y);
MessageBox(buf);*/
//mfc中的字符串 CString
CString str;
str.Format(TEXT("x=%d!!!!!!!!!y=%d"), point.x, point.y);
MessageBox(str);
}
void MyFrame::OnChar(UINT key, UINT, UINT)
{
CString str;
str.Format(TEXT("按下了%c键"), key);
MessageBox(str);
}
void MyFrame::OnPaint()
{
CPaintDC dc(this);
dc.TextOutW(100, 100, TEXT("Sally Face"));
dc.Ellipse(200,200,500, 0);
//画图
}
#include<afxwin.h>
class MyApp :public CWinApp {//CWinApp应用程序
public:
//程序入口
virtual BOOL InitInstance();
};
class MyFrame :public CFrameWnd//窗口框架类
{
public:
MyFrame();
DECLARE_MESSAGE_MAP();//声明宏
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
afx_msg void OnPaint();
};
三,windows字符集
1,多字节字符串转宽字节
2,声明宽字节字符创wchar
3,统计宽字节字符串wcslen
4,TEXT做了自适应编码转换
5,char*CString 之间转换
四,利用向导创建mfc
1,view视类 相片 MainFrame类相框
2,Oncreate Create WM_Create练习
3,OnDraw OnPaint 如果同时存在 OPaint会覆盖OnDraw
五,基于对话框学习控件
1,对话框 模态非模态
2 ,按钮 两个captain修改内容 直接输入内容
3,点击触发事件 右侧属性的闪电图标:右键按钮 添加事件处理程序 双击按钮
4,插入窗口 窗口右键 添加类
5,模态窗口创建 CSlgExec dlg dlg.DoModal()
6,非模态创建 CDlgShow dlg 写到.h做成员----------》dlg.Create 写到初始化oninitDialog 保证只创建一次----------------------》dlg.showWindow()
六,CStaticText静态文本
1,添加变量 以static为结尾的ID是不可以添加变量 需要修改ID
2,设置内容 setWindowTextW
3,获取内容 getWindowTextW按钮也一样
4,利用静态文本显示图片
要求 bmp文件 宏定义:
5,如何禁用按钮 EnableWindow(FALSE)禁用
七,编辑框的使用
1,EditCtrl属性
mutiline多行 want return 滚动条 无限横向 纵向的输入
getWindowText setWindowText 设置和获取值
2,默认的bug单行点击回车就退出
3,退出当前对话框 CDlalog::OnOk() OnCancel()
4,添加变量选择 value
本身关联的变量就是那个值
UpdataData(True)
将控件内容同步到变量中
八,下拉框的使用
常用设置:
属性中加入数据data用英文格式的;经行分割
默认排序 修改Flse不排序
类型DropList不可以编辑
添加AddString
删除DeleteString
插入InsertString
设置默认选项 SetCurSel
获取当前按索引GetCurSel
根据索引获取内容GetLBText(索引,String str)
控件事件::OnCbnSelchangeCombo1
九,列表控件
view 报表模式Report
添加表头 InsertCol
添加正文从0索引
添加第一行第一列Insertitem(0,“张三”);
添加第一行其他列 setitem(行,列,具体内容)
设置风格 整行选中 网格显示
m_list.SetExtendedStyle(m_list.GetExtendedStyle()I LVS_EX_FULLROWSELECTl LVS_EX_GRIDLINES);
十,CTreeCtrl树控件
1设置属性:设置线按钮
2设置图片集合:
setimageList(CImageList*lis,正常显示时的宏)
list准备 create(30,30,32位色,4,4)
add(HICON)
添加节点:
Insertitem(节点名称,显示图片,选中后显示的图,父节点)
设置默认节点 selectitiem
节点间切换 触发事件 OnTvnSelchangedTreel
获取当前项 item=getSelectItem
CString str=getItemText(item)
十一,CTabCtrl标签页的使用
1,引用TabSheet.h.cpp添加到项目中
2,拖入控件 tab ctrl
3,添加变量类型 TabSheet类型
4,创建两个标签页 属性broder改为none stylde改为child
5,标签页添加类
主窗口中添加 标签 m_tab.AddPage(TEXT("系统设置"),&dlg1,IDD_DIALOG1)
6,调用show方法展示出来