现在的位置: 首页 > 综合 > 正文

SDK基本的语句与操作——《c语言也能干大事》笔记

2013年09月20日 ⁄ 综合 ⁄ 共 14707字 ⁄ 字号 评论关闭

1.就像引入图片一样,先点插入。Mean。若选子菜单的分支  可选择(弹出)。。。  分划线  可选择(分隔符)  。。。前面加& 就是快捷键  按Alt加字母。。。

2.  注意== 和 {}  的应用。
    c语言中开发windows时。常用wsprintf 代替 sprintf。解决中文等问题。  但二者用法几乎一模一样。
     比较两个字符串是否相等用lstrcmp,即前面加了个l。
3.改应用程序图标:选择引入。。。选择ico 图片文件。。。选择从属性改ID为1.。。。保存。。。重新生成一下。。。
4.取编辑框中输入的文本
   用函数   GetDlgItemText(hwnd,IDC_EDITNAME,str,sizeof(str))
   解释GetDlgItemText:Get 取得。Dlg  dialog对话,对话框的简写。 Item  项。Text  文字。
   如:case IDC_OK:

          {
               TCHAR name[256];   注意:char  在windows里  char  都用 TCHAR  代替。
               GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name));
               MessageBox(hwnd,name,name,MB_OK);
          }

c语言中开发windows时。常用TCHAR  代替  char。解决中文等问题。但二者用法几乎一模一样。

得到输入的名字:
      
5.上面只是简单的打印出名字, 而不是打出如:***你好   。
    则用到sprintf了。
    比较:printf  是打印到屏幕上。  而sprintf  是打印到字符串中。
   case IDC_OK:

          {
               TCHAR name[256];
               GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name));   注意此语句的各量特点。
               TCHAR msg[256];   重新定义一个字符串。作为sprintf打印的字符串。
               wsprintf(msg,"%s你好",name);   注意此语句的各量特点。
               MessageBox(hwnd,msg,name,MB_OK);
          }

c语言中开发windows时。常用wsprintf 代替 sprintf。解决中文等问题。  但二者用法几乎一模一样。
得到:
  
6.当点某个按钮时   给编辑框中自动输入某些字。
对比GetDlgItemText:Get 取得。Dlg  dialog对话,对话框的简写。 Item  项。Text  文字。
用到函数SetDlgItemText(hwnd,IDC_EDITNAME,“贾占伟”)
   如:switch(id)

    {
        case IDC_OK:
          {
               SetDlgItemText(hwnd,IDC_EDITNAME,"hello,  world!");
          }
        break;
        default:
          break;
    }

7.  简单的加法计算器:
   switch(id)
    {
        case IDC_OK:
          {
               TCHAR str1[256],str2[256];
               //不能用int,因为文本框中也可以输入不是数的东西。
               GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
               GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
               //两个字符串不能相加,需先转换成int型。
               //用c语言中的标准库函数 : atoi  a:ASCII  i:int。
               int i1 = atoi(str1);
               int i2 = atoi(str2);
               int i = i1 + i2;
               TCHAR str3[256];
               wsprintf(str3,"%i",i);
               //也可以用函数:   itoa(i,str3,10);后面的是进制。因为a  是ASCII。
               //可以试一下  2进制。 8进制。 16进制。
               //%i用于输入一个整数,可以是十进制,前有0或0x时,可以是八或十六进制。
               SetDlgItemText(hwnd,IDC_EDIT3,str3);
          }
        break;
        default:
          break;
    }

8.简单的圆面积计算器:
 switch(id)
    {
        case IDC_OK:
          {
               TCHAR str[256];
               GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str));
               int R = atoi(str);
               int s = 3.1415*R*R;
               //注意不知道怎么转换成小数形式的  结果不精确。
               TCHAR str1[256];
               wsprintf(str1,"%i",s);
               //注意三个参数的顺序是什么。。。
               SetDlgItemText(hwnd,IDC_EDIT2,str1);
          }
        break;
        default:
          break;
    }
9.十进制转换为二进制:
switch(id)
    {
        case IDC_OK:
          {
               TCHAR str[256];
               GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str));
               int i = atoi(str);
               TCHAR str1[256];
               itoa(i,str1,2);
               SetDlgItemText(hwnd,IDC_EDIT2,str1);
          }
        break;
        default:
          break;
    }
10.简单的减法运算:
switch(id)

    {
        case IDC_OK:
          {
               TCHAR str1[256];
               TCHAR str2[256];
               GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
               GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
               int i1 = atoi(str1);
               int i2 = atoi(str2);
               int i = i1 - i2;
               char str[256];
               itoa(i,str,10);
               SetDlgItemText(hwnd,IDC_EDIT3,str);
          }
        break;
        default:
          break;
    }

11.报错的方法,即使当输的不是数字时进行报错。
switch(id)
    {
        case IDC_OK:
          {
               TCHAR str1[256];
               TCHAR str2[256];
               GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
               GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
               int i1 = atoi(str1);
               int i2 = atoi(str2);
               //把转换的整型转换成字符型,再与原来的字符串比较,看是否相等。
               TCHAR str11[256];
               TCHAR str22[256];
               sprintf(str11,"%i",i1);
               sprintf(str22,"%i",i2);
               //相等则说明是有效数字。
               if(strcmp(str11,str1) != 0)
               {
                    MessageBox(hwnd,TEXT("输入的第一个数不合法"),TEXT("提示"),MB_OK|MB_ICONERROR);
                    return;
               }
               if(strcmp(str22,str2) != 0)
               {
                    MessageBox(hwnd,TEXT("输入的第二个数不合法"),TEXT("提示"),MB_OK|MB_ICONERROR);
                    return;
               }
               int i = i1 - i2;
               char str[256];
               itoa(i,str,10);
               SetDlgItemText(hwnd,IDC_EDIT3,str);
          }
        break;
        default:
          break;
    }
简化过程,既是定义函数。
BOOL ISInt(TCHAR *str)
//定义一个判断是否为有效数的函数。BOOL函数  ,返回值是  FALSE 或者TRUE。
{
     int i = atoi(str);
     TCHAR str1[256];
     sprintf(str1,"%i",i);
     if(strcmp(str1,str) != 0)
     {
          return FALSE;    
     }
     else
     {
          return TRUE;
     }
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_OK:
          {
               TCHAR str1[256];
               TCHAR str2[256];
               GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
               GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));    
               if(ISInt(str1) == FALSE)
               {
                    MessageBox(hwnd,TEXT("输入的第一个数不合法"),TEXT("提示"),MB_OK|MB_ICONERROR);
                    return;
               }
               if(ISInt(str2) == FALSE)
               {
                    MessageBox(hwnd,TEXT("输入的第二个数不合法"),TEXT("提示"),MB_OK|MB_ICONERROR);
                    return;
               }
               int i1 = atoi(str1);
            int i2 = atoi(str2);
               int i = i1 - i2;
               char str[256];
               itoa(i,str,10);
               SetDlgItemText(hwnd,IDC_EDIT3,str);
          }
        break;
        default:
          break;
    }
}

12.把样式中的下移改为下拉列表就能阻止在组合框中写入信息,既是只能选择某一项。
13.ComboBox的常见的宏的应用,也可当做函数用。也可类比到listbox中。
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
     //放在此位置可以在对话框初始化时就加入选项。
     HWND hwndcombo1 = GetDlgItem(hwnd,IDC_COMBO1);//取得控件的句柄,”对话框句柄加ID“ 。
               ComboBox_AddString(hwndcombo1,TEXT("北京市"));//添加选项。
               ComboBox_AddString(hwndcombo1,TEXT("天津市"));
               ComboBox_AddString(hwndcombo1,TEXT("上海市"));
               ComboBox_AddString(hwndcombo1,TEXT("沈丘县"));
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_OK:
          {
               HWND hwndcombo1 = GetDlgItem(hwnd,IDC_COMBO1);//取得控件的句柄。
               /*int curSel = ComboBox_GetCurSel(hwndcombo1);  //确定目前选项的索引。
               if(0 == curSel)
               {
                    MessageBox(hwnd,TEXT("你选择的是北京市!"),TEXT("提示"),MB_OK);
               }
               if(1 == curSel)
               {
                    MessageBox(hwnd,TEXT("你选择的是上海市!"),TEXT("提示"),MB_OK);
               }
               if(2 == curSel)
               {
                    MessageBox(hwnd,TEXT("你选择的是沈丘县!"),TEXT("提示"),MB_OK);
               }
               if(3 == curSel)
               {
                    MessageBox(hwnd,TEXT("你选择的是天津市!"),TEXT("提示"),MB_OK);
               }*/
               ComboBox_DeleteString(hwndcombo1,3);//删除某一项索引。
               //int N = ComboBox_GetCount(hwndcombo1);//是对话框中索引的个数。
               //  ComboBox_SetCurSel(hwndcombo1,2);//默认选中对话框中的第三项。是int型。将数字定为-1则是取消所有选择。
               //TCHAR str[256];
               //ComboBox_GetLBText(hwndcombo1,2,str);//是得到对话框中的第几项的内容,并存到字符串中。可以用MessageBox显示出来。
          }
        break;
        default:
          break;
    }
}

14。计算器2.0
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
     HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);
     ComboBox_AddString(hwndCombo1,TEXT("+"));
     ComboBox_AddString(hwndCombo1,TEXT("-"));
     ComboBox_AddString(hwndCombo1,TEXT("*"));
     ComboBox_AddString(hwndCombo1,TEXT("/"));//此法,产生的算法顺序乱。可对比下面补充。。。用ComboBox_InsertString(hwndCombo1,-1,TEXT("+"));函数。。。
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_OK:
          {
               TCHAR str1[256];
               TCHAR str2[256];
               GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
               GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
               int i1 = atoi(str1);
               int i2 = atoi(str2);
                  int i3;
               HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);
               int n = ComboBox_GetCurSel(hwndCombo1);
               //可以用switch语句来写,更简单。
               if(0 == n)
               {
                    i3 = i1 - i2;
               }
               if(1 == n)
               {
                    i3 = i1 * i2;
               }

               f(2 == n)
               {
                    i3 = i1 / i2;
               }
               if(3 == n)
               {
                    i3 = i1 + i2;
               }
                 TCHAR str3[256];
                 itoa(i3,str3,10);
                 SetDlgItemText(hwnd,IDC_EDIT3,str3);
          }
        break;
        default:
          break;
    }
}
补充:
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
     HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);
     ComboBox_InsertString(hwndCombo1,-1,TEXT("+"));
     ComboBox_InsertString(hwndCombo1,-1,TEXT("-"));
     ComboBox_InsertString(hwndCombo1,-1,TEXT("*"));
     ComboBox_InsertString(hwndCombo1,-1,TEXT("/"));
    return TRUE;
}
15.学生管理系统
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_ADD:
          {
               TCHAR str[256];
               GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str));
               HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);
               ComboBox_AddString(hwndCombo1,str);
               //清空加入选项后,编辑框中的内容。
               SetDlgItemText(hwnd,IDC_EDIT1,TEXT(" "));
          }
        break;
          case IDC_RES:
          {
               TCHAR str[256];
               GetDlgItemText(hwnd,IDC_EDIT2,str,sizeof(str));
               HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);
               int N = ComboBox_GetCount(hwndCombo1);
               int i;
               BOOL iFound = FALSE;
               for(i = 0;i < N ;i++)
               {
                    TCHAR s[256];
                    ComboBox_GetLBText(hwndCombo1,i,s);
                    if(0 == lstrcmp(s,str))
                    {
                         iFound = TRUE;
                         ComboBox_SetCurSel(hwndCombo1,i);
                    }    
               }
               if(!iFound)
                    {
                         MessageBox(hwnd,TEXT("对不起,没有找到!"),TEXT("提示"),MB_OK|MB_ICONWARNING);
                         break;
                    }
                   
          }
        break;
          case IDC_DEL:
          {
               HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);
               int i = ComboBox_GetCurSel(hwndCombo1);
               //当没有选择项时返回值是 CB_ERR  。
               if(CB_ERR == i)
               {
                    MessageBox(hwnd,TEXT("删除完毕,无可选择项!"),TEXT("提示"),MB_OK|MB_ICONERROR);
                    return;
               }
               //删完后,还存有最后一次的选项在编辑框中,这牵涉到空键刷新。先不在乎。
               ComboBox_DeleteString(hwndCombo1,i);
          }
        break;
          case IDC_EXIT:
          {
               exit(1);
          }
        break;
        default:
          break;
    }
}
16.取系统时间的方法:
void CALLBACK MyTimerProj(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime)
{
     SYSTEMTIME stLocal;   //定义一个SYSTEMTIME类型的时间结构体
     TCHAR str[256];        
     GetLocalTime(&stLocal);   //获取当前时间的函数GetLocalTime 其参数是一个时间结构体指针。函数将当前时间保存到结构体&stLocal中,
     wsprintf(str,"%i年%i月%i日 %i:%i:%i",stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond); 
     //将时间结构体中的数据打印到  字符串str中。。。
     SetDlgItemText(hwnd,IDC_EDIT1,str); //写到编辑框中。。。
//     MessageBox(hwnd,TEXT("我以为\n只要很认真的爱\n就能打动一个人\n却原来\n打动的只是我自己\n.... "),TEXT("...爱情..."),MB_OK);
     SendMessage(hwnd,WM_SYSCOMMAND,SC_MONITORPOWER,2);
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
     SetTimer(hwnd,0,1000,MyTimerProj);  

     //注意各参数的意义。。。其中1000是执行的时间间隔是1000毫秒,既是1秒。。。
    //记住这个函数的参量   void CALLBACK MyTimerProj(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime)
     return TRUE;
}
17.复选按钮是否选中
switch(id)
    {
        case IDC_OK:
          {
               HWND hwndCheck1 = GetDlgItem(hwnd,IDC_CHECK1);
               int checkState = Button_GetCheck(hwndCheck1);
               //checkState有三种情况,但常用的有BST_CHECKED和BST_UNCHECKED两种,所以不能用else。
               if(BST_CHECKED == checkState)
               {
                    MessageBox(hwnd,TEXT("选中"),TEXT(""),MB_OK);
               }
               if(BST_UNCHECKED == checkState)
               {
                    MessageBox(hwnd,TEXT("没选中"),TEXT(""),MB_OK);
               }
          }
        break;
          case IDC_BUTTON1:
          {
               HWND hwndCheck1 = GetDlgItem(hwnd,IDC_CHECK1);
               int checkState = Button_GetCheck(hwndCheck1);
               if(BST_CHECKED == checkState)
               {
                    Button_SetCheck(hwndCheck1,BST_UNCHECKED);//设置选择的函数:Button_SetCheck(句柄,是否选中)。。。
               }
               if(BST_UNCHECKED == checkState)
               {
                    Button_SetCheck(hwndCheck1,BST_CHECKED);
               }
          }
        break;
        default:
          break;
    }
18.记事本。。。
case ID_MENUITEMOPEN:
          {
               FILE *fp = fopen("c:/1.txt","r");  //打开文件
               char str[256];
               fgets(str,sizeof(str),fp);  //读取文件并存放到字符串str中
               fclose(fp);  // 关闭文件。
               SetDlgItemText(hwnd,IDC_RICHEDIT1,str);
          }
        break;
richedit的使用要在Main.cpp中加上一句:LoadLibrary(“riched32.dll”)红线处;需放在DialogBox之前,因为它被调用对话框就已经显示出来了。
具体如图:
19.打开文件选择框。。。
记得前面加#include<commdlg.h>的头文件。
case IDC_OK:
          {
               //是一个结构体
               OPENFILENAME ofn; 
               //这定义的是一个文件名
               char szFile[MAX_PATH];  
               //ZeroMemory就是memset的宏定义确切的说是特殊情况(可以右键看它的定义)是给结构体清零的,属于c语言知识。
               //memset是给某段内存置为某一个值不一定是0.但是zeromemory是置为0.
               ZeroMemory(&ofn,sizeof(ofn));
               ofn.lStructSize = sizeof(ofn);
               //ofn.lpstrFile 使结构体的文件指向szFile。
               ofn.lpstrFile = szFile;
               ofn.lpstrFile[0] = TEXT('\0');
               ofn.nMaxFile = sizeof(szFile);
               //ofn.lpstrFilter为文件编辑器设置过滤器,就是文件格式选择那个小框框。
               //  \0 是字符串结束符 。 *.*  是文件名.后缀  意思是“所有文件”。
               ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.txt\0c++\0*.cpp\0");
               //默认选择过滤器的序号为 1 。
               ofn.nFilterIndex = 1;
               ofn.lpstrFileTitle = NULL;
               ofn.nMaxFileTitle = 0;
               ofn.lpstrInitialDir = NULL;
               //为什么后来加上这句就阻止继续操作前一个窗口了啊。是不是前面的都是指针 句。
               ofn.hwndOwner = hwnd; 
               //在ofn.Flags中加一句‘ |OFN_ALLOWMULTISELECT ’可以使一次选择多个文件。
               ofn.Flags = OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
                //把文件路径在编辑框中显现出来;
                SetDlgItemText(hDlg,IDC_EDIT,szFile);
                //读取文件内容
               if(GetOpenFileName(&ofn))
               {
                    //MessageBox(NULL,szFile,"",MB_OK);
                    FILE *fp = fopen(szFile,"r");
                    char str[256];
                    if(fgets)
                         fgets(str,sizeof(str),fp);
                    fclose(fp);
                    SetDlgItemText(hwnd,IDC_EDIT1,str);
               }
          }
        break;
        default:
          break;
补充:1.学习怎么使用GetSaveFileName这个函数。 2.怎么读取全文件内容 。 3。怎么读取多文件内容。

抱歉!评论已关闭.