Win32API学习笔记第七章(三)

这次是最后一部分的对话框的部分了
这次主要是对一个程序作介绍,这个程序用了三个窗口类(实际上只是结构体,只是非常像WNDCLASS)
前两个很相似,最后一个涉及到字体创建的可能与前两个有所不同

1:FINDREPLACE

这个类就是一个创建查询框的一个类,类的内容都可以在MSDN上可以查到详细的,这里就不说了,值得一提的是,这里面自带了一个HOOK的位置,如果有需要,可以自己写一个窗口过程,类似于WNDCLASS里面的WndProc一样。
同时我们可以在定义完以后调用:
FindText (LPFINDREPLACE) ;和ReplaceText (LPFINDREPLACE) ;来对其进行查找和查找并替换。
(注意两个窗口样式不同,所以一个类不可以直接创建两个窗口,而是要先注册完一个之后在修改注册另一个(这个是对wndclass修改的方法)在这里,通常都是分别创建,因为两者正常情况下是不可能同时出现的(调用FindText (LPFINDREPLACE) ;和ReplaceText (LPFINDREPLACE);将出现两个对话框)。

2:OPENFILENAME

这个类和之前的那一个类似,只是参数更多了一些,同样,也可以到MSDN上找到非常详细的说明,这里就只有一个调用显示的函数:GetOpenFileName (LPOPENFILENAME) ;
在书上的PopPad3程序中:(片段)

BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
     ofn.hwndOwner         = hwnd ;
     ofn.lpstrFile         = pstrFileName ;
     ofn.lpstrFileTitle    = pstrTitleName ;
     ofn.Flags             = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;

     return GetOpenFileName (&ofn) ;
}

BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
     ofn.hwndOwner         = hwnd ;
     ofn.lpstrFile         = pstrFileName ;
     ofn.lpstrFileTitle    = pstrTitleName ;
     ofn.Flags             = OFN_OVERWRITEPROMPT ;

     return GetSaveFileName (&ofn) ;
}

我们首先注意到我们打开和保存都会对这个类里面的内容做一些更新,这就是和之前那个的一个小区别(其实之前那个也可以这么做)。
之后就是一个很难得到的地方了:这个程序用了一个Unicode的判断方法:

BOOL PopFileWrite (HWND hwndEdit, PTSTR pstrFileName)
{
     DWORD  dwBytesWritten ;
     HANDLE hFile ;
     int    iLength ;
     PTSTR  pstrBuffer ;
     WORD   wByteOrderMark = 0xFEFF ;

          // Open the file, creating it if necessary

     if (INVALID_HANDLE_VALUE == 
               (hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, 
                                    NULL, CREATE_ALWAYS, 0, NULL)))
          return FALSE ;

          // Get the number of characters in the edit control and allocate
          // memory for them.

     iLength = GetWindowTextLength (hwndEdit) ;
     pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)) ;

     if (!pstrBuffer)
     {
          CloseHandle (hFile) ;
          return FALSE ;
     }

          // If the edit control will return Unicode text, write the
          // byte order mark to the file.

#ifdef UNICODE
     WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
#endif

          // Get the edit buffer and write that out to the file.

     GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;
     WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR), 
                &dwBytesWritten, NULL) ;

     if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten)
     {
          CloseHandle (hFile) ;
          free (pstrBuffer) ;
          return FALSE ;
     }

     CloseHandle (hFile) ;
     free (pstrBuffer) ;

     return TRUE ;
}

这段代码

#ifdef UNICODE
     WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
#endif

这一段就是将占位符0xFEFF定位字节序写入文件头表示这个文本为Unicode,同时还要考虑到大小断续的问题(检测字节序的顺序)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值