待编辑……

取得复选按钮的是否选中: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对象,则在用户关闭该对话框时会自动撤消这个CButton对象。如果在窗口中创建了CButton对象,就可能需要自己撤消它。如果是用new函数在内存的堆中创建该对象的,则在用户关闭该窗口按钮控件时,必须用delete函数撤消它。如果在堆栈中创建了该对象,或者它嵌入在父对话框对象中,系统会自动撤消它。   #include <afxwin.h>

  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的含义见上边

2char szFile[MAX_PATH];//定义一个长度为MAX_PATHchar数组。

MAX_PATH是系统定义的一个宏,260Windows操作系统文件路径的最大长度。

3ofn.lpstrFile = szFile;
//szFile是一个字符数组,那么szFile这个名字就代表这个字符数组的首地址

4)文件类型过滤器

*.*就表示所有文件

*.txt就表示所有文本文件

abc*.*就表示所有以abc开头的文件

abc*.txt就表示所有以abc开头的文本文件(txt

ofn.lpstrFilter = TEXT("ALL/0*.*/0Text/0*.TXT/0");用“/0”分割出几个段,每两段是一组过滤器,每组的第一个段代表过滤器的显示的值,而第二段表示真正的过滤器

5ofn.nFilterIndex = 2;默认选择第几个过滤器,是1开始的,不是0.这也是试验出来的。

6windows的一个惯例:结构体的指针类型别名一般是LP+结构体的名字

GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),因为GetOpenFileName函数要的是OPENFILENAME的指针

7)用户关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表示用户选择了文件,如果等于FALSE就表示用户选择了【取消】按钮

 

第三节

1GetOpenFileName

希望同学们不要只记我教的结果,而是要跟着我的思路进行思考,看解决问题的方式。否则就又变成“我教同学们学”的填鸭式教育了。


(2)课上练习:打开对话框,用户选择一个音乐文件,然后用MCIsendString播放,注意ShortPath的问题。如何让音乐文件跟着文件走,GetModuleFileNameGetCurrentDirectory

3)打开多个文件:

增加OFN_ALLOWMULTISELECT选项后测试一下。发现如果选择一个文件后显示的还是这个文件的路径,可是如果选择多个文件显示的就只有目录的路径,怎么回事?

调试一下,看看szFile在内存中的样子。调试的是发现内存中的样子是目录的路径然后加上各个文件名,中间用“/0”分割,现在明白为啥值显示目录的路径了吗?

大家明白这一点就可以了,有兴趣的可以课后来做多文件选择的处理。做播放器的时候经常需要这个功能,也就是播放列表。有一篇文章可以参考一下:http://xxkkff.blog.51cto.com/162016/26222

2GetSaveFileName


保存文件对话框


只要把上边函数换成GetSaveFileNameOFN本来是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-FreePelles CDev C++CodeBlocksC-Free使用演示(VistaWin7上资源编辑器可能有问题)。

 

学完第七节就可以开始从第一版11节开始继续学习了、第12节也是旧版的,不用看。第1110节中还有一些在第二版中没有讲的东西,有兴趣的可以去粗略的过一遍,当然不学第一版也能继续向后学。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值