取得复选按钮的是否选中:Button_SetCheck
Button_SetCheck(hwndCtrl,BST_CHECKED /BST_UNCHECKED)
例子:HWND hwndCheck=GetDlgItem(hwnd,IDC_CHECK1);//得到句柄
int checkState=Button_SetCheck(hwndCheck );
if(BST_CHECKED =checkState)
{MessageBox(hwnd,TEXT("选中"),TEXT(""),MB_OK);
}
if(BST_UNCHECKED=checkState)
{MessageBox(hwnd,TEXT("未选中"),TEXT(""),MB_OK);
}
CButton
类CButton提供了对Windows按钮控件的操作。按钮控件是一个小的矩形子窗口,可以通过单击选中(按下)或不选中。按钮可以单独使用,也可以成组使用,它还可以具有文本标题。在用户单击它的时候,按钮通常要改变显示外观。
典型的按钮控件有:复选框、单选钮和下压式按钮(push button)。一个CButton对象可以是它们中的一种,这由它的按钮风格和成员函数Create的初始化决定。
此外,类CButtonBitmap是从类CButton继承而来的,不过它支持按钮的图像标签。一个CButtonBitmap对象可以分别为它的四种状态(未按下、按下、获得焦点和禁止存取)设置不同的位图。 既可以从对话框模板中创建一个按钮控件,也可以直接在代码中创建。 无论哪种情况,都要先调用构造函数CButton构造一个CButton对象,然后调用成员函数Create创建Windows按钮控件并应用到CButton对象上。 在一个从类CButton派生出来的类中,构造可以一步完成。程序员可以为这个派生类编写一个构造函数,并在其中调用Create函数。 如果想处理Windows的通知消息,如位图按钮控件发给它的父对象(通常是从CDialog继承来的)的消息,就要在父对象中加入消息映射入口以及处理每个消息的成员函数。 每个消息映射入口的格式如下: ON_Notification(id, memberFxn) 其中id指定了发送通知的控件的子窗口的ID,而memberFxn指定了处理该通知的父对象中的成员函数名。 父对象的函数原型格式如下: afx_msg void memberFxn( ); 可能的消息映射入口如下:映射入口 何时向父对象发送消息ON_BN_CLICKED 用户单击按钮时ON_BN_DOUBLECLICKED 用户双击按钮时 |
CButton::Create 创建一个CButton对象
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); lpszCaption是按钮上显示的文本; dwStyle指定按钮风格,可以是按钮风格与窗口风格的组合,取值有: 窗口风格: WS_CHILD 子窗口,必须有 WS_VISIBLE 窗口可见,一般都有 WS_DISABLED 禁用窗口,创建初始状态为灰色不可用的按钮时使用 WS_TABSTOP 可用Tab键选择 WS_GROUP 成组,用于成组的单选按钮中的第一个按钮 按钮风格: BS_PUSHBUTTON 下压式按钮,也即普通按钮 BS_AUTORADIOBUTTON 含自动选中状态的单选按钮 BS_RADIOBUTTON 单选按钮,不常用 BS_AUTOCHECKBOX 含自动选中状态的复选按钮 BS_CHECKBOX 复选按钮,不常用 BS_AUTO3STATE 含自动选中状态的三态复选按钮 BS_3STATE 三态复选按钮,不常用 以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。 BS_BITMAP 按钮上将显示位图 BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮 rect指定按钮的大小和位置; pParentWnd指示拥有按钮的父窗口,不能为NULL; nID指定与按钮关联的ID号,用上一步创建的ID号。 返回值:若成功,返回非0;否则返回0 CButton::DrawItem 重载该函数绘制一个CButton对象,由框架调用该函数 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 参数:lpDrawItemStruct指向包含绘制项信息和要求类型的LPDRAWITEMSTRUCT结构的长指针 CButton::SetCheck 设置或复位单选按钮和复选按钮的选择状态 void SetCheck(int nCheck); 参数:nCheck 指定设置的状态,0为未选择,1为选中,2为不确定 操作
ListBox(和Combo类似)
(1)添加项:
如果有采用LBS_SORT填入清单方块最简单的方法是借助ListBox_AddString:
HWND hwndList=GetDlgItem(hwnd,IDC_LIST1);//得到句柄int ListBox_AddString(hwndList,TEXT("000"));
如果没有采用LBS_SORT,那么可以使用ListBox_InsertString指定一个索引值,将字符串插入到清单方块中:
int ListBox_InsertString(HWND hwndCtl, int index, LPCSTR lpsz);
(2)删除项:
int ListBox_DeleteString(HWND hwndCtl, int index);
(3)取得有多少项:
int ListBox_GetCount(HWND hwndCtl);
(4)选定某一项int ListBox_SetCurSel(
HWND hwndCtl, int index);将iParam设定为-1则取消所有选择
(5) 确定目前选项的索引:int ListBox_GetCurSel(
HWND hwndCtl); 如果没有项目被选中,那么从呼叫中传回的iIndex值为LB_ERR。
(6)将某项目复制到文字缓冲区中:int ListBox_GetText(
HWND hwndCtl, int index, LPCTSTR lpszBuffer);
9、菜单资源
(1)制作好菜单资源后,在对话框的Menu属性中选择刚才制作好的对话框。
(2)响应菜单操作。菜单点击后也会发送WM_COMMAND消息id就是被选择菜单的id。例子:
case IDM_QUIT:
板书:
作业点评: 文件操作。自己动手写记事本。
RichEdit控件。LoadLibrary( "riched32.dll" );
参考资料:http://msdn.microsoft.com/en-us/library/bb787605(VS.85).aspx
5、给结构体所有字段置零
复习一下C语言中memset以及结构体的应用。C语言中声明一个结构体变量之后,在使用这个变量之前要首先用memset来把各个位清零。使用C语言内置的函数memset来完成:
memset(&s1,sizeof(s1),0);
在这里我们使用ZeroMemory“函数”,ZeroMemory其实并不是函数,其实是memset的宏定义
ZeroMemory其实就是memset,纸老虎而已,不是一个全新的函数。
6、打开文件对话框的使用
首先#include <commdlg.h>
OPENFILENAME ofn;
char szFile[MAX_PATH];
ZeroMemory(&ofn,sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = TEXT('/0');
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("ALL/0*.*/0Text/0*.TXT/0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.hwndOwner = hwnd;//自学能力、探索能力、猜测能力
ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))
{
MessageBox(NULL,szFile,"",MB_OK);
}
参数太多只能搞Struct。下面将对这段代码作解释:
(1)、ZeroMemory的含义见上边
(2)char szFile[MAX_PATH];//定义一个长度为MAX_PATH的char数组。
MAX_PATH是系统定义的一个宏,260。Windows操作系统文件路径的最大长度。
(3)ofn.lpstrFile = szFile;
//szFile是一个字符数组,那么szFile这个名字就代表这个字符数组的首地址
(4)文件类型过滤器
*.*就表示所有文件
*.txt就表示所有文本文件
abc*.*就表示所有以abc开头的文件
abc*.txt就表示所有以abc开头的文本文件(txt)
ofn.lpstrFilter = TEXT("ALL/0*.*/0Text/0*.TXT/0");用“/0”分割出几个段,每两段是一组过滤器,每组的第一个段代表过滤器的显示的值,而第二段表示真正的过滤器
(5)ofn.nFilterIndex = 2;默认选择第几个过滤器,是1开始的,不是0.这也是试验出来的。
(6)windows的一个惯例:结构体的指针类型别名一般是LP+结构体的名字
GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),因为GetOpenFileName函数要的是OPENFILENAME的指针
(7)用户关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表示用户选择了文件,如果等于FALSE就表示用户选择了【取消】按钮
第三节
1、GetOpenFileName
希望同学们不要只记我教的结果,而是要跟着我的思路进行思考,看解决问题的方式。否则就又变成“我教同学们学”的填鸭式教育了。
(2)课上练习:打开对话框,用户选择一个音乐文件,然后用MCIsendString播放,注意ShortPath的问题。如何让音乐文件跟着文件走,GetModuleFileName、GetCurrentDirectory
(3)打开多个文件:
增加OFN_ALLOWMULTISELECT选项后测试一下。发现如果选择一个文件后显示的还是这个文件的路径,可是如果选择多个文件显示的就只有目录的路径,怎么回事?
调试一下,看看szFile在内存中的样子。调试的是发现内存中的样子是目录的路径然后加上各个文件名,中间用“/0”分割,现在明白为啥值显示目录的路径了吗?
大家明白这一点就可以了,有兴趣的可以课后来做多文件选择的处理。做播放器的时候经常需要这个功能,也就是播放列表。有一篇文章可以参考一下:http://xxkkff.blog.51cto.com/162016/26222
2、GetSaveFileName
保存文件对话框
只要把上边函数换成GetSaveFileName。OFN本来是OpenFileName的简写,它SaveFileName也跑来凑热闹,吼吼。如果需要保存文件覆盖提示怎么办呢?看看OFN有选项吗?OFN_OVERWRITEPROMPT
Mcisendstring播放音乐,配合GetOpenFileName实现播放器
GetShortPathName
mciSendString(“play ***”,"",0,NULL);
Mcisendstring更多用法(暂停、继续、录音、播放进度控制)参考
http://baike.baidu.com/view/1622810.htm?fr=ala0_1
http://msdn.microsoft.com/en-us/library/dd743572(VS.85).aspx
作业:提供打开、保存功能的记事本
作业:自己动手写播放器 http://so.rupeng.com/?keyword=C%E8%AF%AD%E8%A8%80+%E6%92%AD%E6%94%BE%E5%99%A8
更多控件用法 http://msdn.microsoft.com/en-us/library/bb773169(VS.85).aspx
VC就是全部、VC不是唯一:C-Free、Pelles C、Dev C++、CodeBlocks。C-Free使用演示(Vista、Win7上资源编辑器可能有问题)。
学完第七节就可以开始从第一版11节开始继续学习了、第12节也是旧版的,不用看。第1版1至10节中还有一些在第二版中没有讲的东西,有兴趣的可以去粗略的过一遍,当然不学第一版也能继续向后学。