查看: 2927|回复: 3
打印 上一主题 下一主题

c语言也能干大事板书(4\6\7)

[复制链接]
跳转到指定楼层
沙发
发表于 2014-9-16 13:49:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 伊海 于 2014-9-16 13:52 编辑

板书四:
(8)作业:做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。
(9)作业:用户输入十进制整数,在另外一个文本框中显示整数的二进制形式。做一个十进制到二进制的转换小工具。
(10)作业:计算两个数的差
(11)思考:这个计算两个数的和程序有什么缺陷?没有阻止用户输入非数字。怎么解决。
调试的技巧,断点:执行到断点的时候程序暂停住。
板书:上节课的作业你自己写了吗?比我快吗?如果没有写的话别继续往下看,先回去自己写。
实现“自己动手写计算器2.0版”,允许选择运算符号。
ComboBox的操作
(1)添加项:
填入Combo最简单的方法是借助ComboBox_AddString“函数”(其实是宏):
  1. ComboBox_AddString(hwndCtrl,str)
复制代码
每个控件也有自己的句柄。句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例、窗口、图片、图标等等。控件句柄和控件id的区别:控件句柄在每次运行的时候都是不一样的,而控件id则是确定的。ComboBox_AddString等几乎所有控件函数都可以对整个Windows中的控件进行控制(有的游戏外挂的原理),在一个对话框内id不能重复,但是在不同的对话框内则可以重复,因此需要一个全局的不重复的句柄来表示控件,通过对话框+id联合确定。两个不同的程序(哪怕是同一个程序启动的两个不同的实例,开两个记事本)是找到我爸,然后找我父亲的id=1的儿子,也就是我,然后再打我。这就是通过我父亲的把柄和我的id=1来定义我
GetDlgItem由对话框句柄+id得到控件的句柄。
Main_OnInitDialog对话框初始化的时候被调用。
做一个例子
(2) 确定目前选项的索引:
int ComboBox_GetCurSel(
    HWND hwndCtl);Cur:CurrentSel:Selection返回值是当前项的编号,从0开始。得到的不是“北京市”这样的字符串,而是索引(编号)如果没有项目被选中,那么从函数中传回的iIndex值为CB_ERR。//做一个例子
(3)删除项:
int ComboBox_DeleteString(
    HWND hwndCtl,    int index); //做一个例子
(4)取得有多少项:
int ComboBox_GetCount(
    HWND hwndCtl);//返回值是个数。
(5)选定某一项
int ComboBox_SetCurSel(
    HWND hwndCtl,    int index);将index设定为-1则取消所有选择(6)得到某项的值
int ComboBox_GetLBText(
    HWND hwndCtl,    int index,    LPCTSTR lpszBuffer);
怎么让Combo不能改?
类型:下拉列表
更多ComboBox的用法
http://msdn.microsoft.com/en-us/library/cc656426(VS.85).aspx
是宏,不是函数。SendDlgItemMessage/SendMessage。
额外知识,不讲,自学(不想变成填鸭式教育,课上只讲思想性的东西,会给大家学习资料,希望大家培养自学能力)

实现四则运算器:
作业
(1)给本节课的小练习提改进建议并且自己实现。
(2)学生管理系统(画原型界面布置)增、删、查(双击)、搜

回复

使用道具 举报

板凳
 楼主| 发表于 2014-9-16 13:53:51 | 只看该作者
本帖最后由 伊海 于 2014-9-16 13:59 编辑

板书六:
接下来我们要实现小时钟。
涉及到的主要知识点是定时器的使用,涉及到的C知识就是函数指针(回调函数)
使用定时器
回调就是不是你调别人,而是别人调你。时间到了会叫你,没到的时候不会烦你。
让Windows直接将定时器消息发送给您程序的另一个函数。
我们把以下的callback函数称为TimerProc(您能够选择与其它一些用语不会发生冲突的任何名称),它只处理WM_TIMER消息:
  1. VOID CALLBACK TimerProc (
  2. HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);
复制代码
得到当前日期:
  1. void GetLocalTime(LPSYSTEMTIME);
复制代码
课上练习:
  1. SYSTEMTIME stLocal;
复制代码
  1. //显示时间的间隔。

  2. wsprintf(chBuf,TEXT("%u/%u/%u %u:%u:%u:%u 周%d\r\n"),

  3. stLocal.wYear, stLocal.wMonth, stLocal.wDay,

  4. stLocal.wHour, stLocal.wMinute, stLocal.wSecond,

  5. stLocal.wMilliseconds,stLocal.wDayOfWeek);

  6. MessageBox(NULL,chBuf,"",MB_OK);

  7. SetTimer(hwnd,1,1000,TimerProc);

  8. void CALLBACK TimerProc (HWND hwnd, UINT message, UINTiTimerID, DWORD dwTime)
  9. {
  10. SYSTEMTIME time;
  11. GetLocalTime(&time);
  12. TCHAR strTime[256];
  13. //%后面的0表示不够的位数补零,5是总位数,就这样
  14. wsprintf(strTime,"%04d-%02d-%02d%02d:%02d:%02d",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
  15. SetDlgItemText(hwnd,IDC_EDTTIME,strTime);
  16. }
复制代码

作业:定时关机、定时关闭显示器,如何编程实现关机、关显示器。到整天播放音乐。自学!!!“关闭显示器 API”、“关闭显示器
函数”
取得复选按钮的是否选中:
  1. LRESULT Button_GetCheck(
  2.     HWND hwndCtl);BST_CHECKEDBST_UNCHECKED设置复选按钮是否选中:
  3. LRESULT Button_SetCheck(
  4.     HWND hwndCtl,    int check);BST_CHECKEDBST_UNCHECKED7、ListBox(和Combo类似)
复制代码
(1)添加项:
如果采用LBS_SORT样式,那么填入清单方块最简单的方法是借助ListBox_AddString:
  1. int ListBox_AddString(
  2.     HWND hwndCtl,    LPCSTR lpsz);<span style="line-height: 1.5; background-color: rgb(255, 255, 255);">  </span>
复制代码
如果没有采用LBS_SORT,那么可以使用ListBox_InsertString指定一个索引值,将字符串插入到清单方块中:
  1. int ListBox_InsertString(
  2.     HWND hwndCtl,    int index,    LPCSTR lpsz);
复制代码
(2)删除项:
  1. int ListBox_DeleteString(
  2.     HWND hwndCtl,    int index);
复制代码

(3)取得有多少项:
  1. int ListBox_GetCount(
  2.     HWND hwndCtl);
复制代码
(4)选定某一项
  1. int ListBox_SetCurSel(
  2.     HWND hwndCtl,    int index);
复制代码
将iParam设定为-1则取消所有选择
(5)确定目前选项的索引:
  1. int ListBox_GetCurSel(
  2.     HWND hwndCtl);
复制代码
如果没有项目被选中,那么从呼叫中传回的iIndex值为LB_ERR。
(6)将某项目复制到文字缓冲区中:
  1. int ListBox_GetText(
  2.     HWND hwndCtl,    int index,    LPCTSTR lpszBuffer);
复制代码
菜单资源
(1)制作好菜单资源后,在对话框的Menu属性中选择刚才制作好的对话框。
(2)响应菜单操作。菜单点击后也会发送WM_COMMAND消息id就是被选择菜单的id。例子:
  1. case IDM_QUIT:
复制代码


作业:文件操作。自己动手写记事本。路径写固定的路径。
下节课内容:作业点评,文件对话框、播放音乐

回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2014-9-16 14:04:08 | 只看该作者
板书七:
作业点评: 文件操作。自己动手写记事本。
RichEdit控件。LoadLibrary( "riched32.dll" );
参考资料:http://msdn.microsoft.com/en-us/library/bb787605(VS.85).aspx

1、给结构体所有字段置零
复习一下C语言中memset以及结构体的应用。C语言中声明一个结构体变量之后,在使用这个变量之前要首先用memset来把各个位清零。
使用C语言内置的函数memset来完成:
  1. memset(&s1,sizeof(s1),0);
复制代码
在这里我们使用ZeroMemory“函数”,ZeroMemory其实并不是函数,其实是memset的宏定义
ZeroMemory其实就是memset,纸老虎而已,不是一个全新的函数。

2、打开文件对话框的使用
首先
  1. #include <commdlg.h>
复制代码
参数太多只能搞Struct。
下面将对这段代码作解释:
(1)ZeroMemory的含义见上边
(2)charszFile[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就表示用户选择了【取消】按钮


回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2014-9-16 14:04:57 | 只看该作者
第三节
1、GetOpenFileName
希望同学们不要只记我教的结果,而是要跟着我的思路进行思考,看解决问题的方式。否则就又变成“我教同学们学”的填鸭式教育了。
课上练习:打开对话框,用户选择一个音乐文件,然后用MCIsendString播放,注意ShortPath的问题。如何让音乐文件跟着文件走,GetModuleFileName、GetCurrentDirectory
打开多个文件:
增加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节中还有一些在第二版中没有讲的东西,有兴趣的可以去粗略的过一遍,当然不学第一版也能继续向后学。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表