WinCE应用程序开发技巧_第1页
WinCE应用程序开发技巧_第2页
WinCE应用程序开发技巧_第3页
WinCE应用程序开发技巧_第4页
WinCE应用程序开发技巧_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 HYPERLINK http:/www.armbb/forum.php?mod=viewthread&tid=10943 WINCE 禁止MFC程序窗口上的OK按钮 HYPERLINK http:/www.armbb/forum.php?mod=viewthread&tid=10943&fromuid=28079 o 您的朋友访问此链接后,您将获得相应的积分奖励 复制链接 打开资源文件(*.rc)(我用记事本),找到这行:EXSTYLE WS_EX_APPWINDOW | 0 x80000000L.只要将这一句删除或者注释,就可以去掉OK按钮.同理,如果要添加OK键,在其后添上EXSTYLE

2、 WS_EX_APPWINDOW | 0 x80000000L即可.WinCE与PC机的USB同步蓝屏解决方法方法1在安装USB驱动的时候,不使用官方的驱动,而是使用Microsoft ActiveSync下有个drivers文件夹的usb驱动。就不会蓝屏了。方法2WIN XP SP3,笔记本电脑(主要还不清楚是否有那些硬件不兼容)安装 USB下载驱动正常,但启动CE后,连接USB线到电脑无法自动安装驱动,使用提供的CE连接驱动安装完成即电脑系统蓝屏若USB线一直连接电脑,电脑重启直接蓝屏经过多次实验后,最终解决1.先连接电脑,并安装驱动,蓝屏后关机,然后拔掉USB线启动进入系统,将 INF目

3、录下的wceusbsh.inf,wceusbsh.PNF删除,将system32driverswceusbsh.sys删除2. 不用重启,连接USB线,同步工具将会显示连接,具体不太清楚怎么回事,有空再想想,不过问题得以解决有同样情况的可以试试用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果 近日在为一个数据应用写数据输入界面,大量的编辑框要想实现快速的输入就是有设计良好的符合工作流程的tab键序。相信,不少的人在使用具有大量编辑框的程序时都有这样的想法和感概。而我这个对话框界面主要输入的是数字,因此如果使用tab键作编辑框之间的跳转会在使用数字键盘时不方便。因此,就考虑了用回

4、车键来实现tab键的功能。因为mfc对话框的特点,基于mfc对话框的对话框按下回车键会调用框架内的的onok成员函数导至退出。即使你去掉idc_ok按键的bs_defpushbutton 属性也是不行的。必须重载wm_getdefid,因为当用户按下回车键时,windows发送wm_getdefid消息来获得缺省的命令id,windows再将它作为wm_command发送,所以重载这个消息必须在高位字中返回dc_hasdefid。 如下所例:begin_message_map(cmydlg, cdialog) on_message(dm_getdefid, ongetdefid) .end_m

5、essage_map()lresult cmydlg:ongetdefid(wparam wp, lparam lp) return makelong(0,dc_hasdefid); 这是一种方法,另外一种方法是在消息循环处着手处理。重载pretranslatemessage这个虚函数,将消息队列中有关键盘按下的消息给拦载下来,在框架之前处理wm_keydown消息。判断是按下回车键后,我们可以用getnextdlgtabitem 函数获得tab键序中下一个或上一个接受tab键的控件句柄。示例代码如下:bool ckeydowndlg:pretranslatemessage(msg* pmsg

6、) if (pmsg-message = wm_keydown & pmsg-wparam = vk_return) cwnd *mwnd = getnextdlgtabitem (getfocus(); /取得当前焦点控件的下一个控件的句柄 if (mwnd) mwnd-setfocus(); /设置下一件控件得到输入焦点 return true; return cdialog:pretranslatemessage(pmsg); 但是,各位有没有注意到。这样处理之后,虽然可以在各个控件之进行输入焦点的转移。可是当一个按钮控件获得了焦点之后,也是按下回车键。以前我们习惯中或者说预料中按下该按

7、钮的后应该执行的功能没有被执行,而焦点又跑到按钮之后的控件上去了。这就是上面代码的不足之处,虽然实现了焦点由回车键控件转移,但是按钮却不能用回车键来操作了。只以用鼠标,这和大家习惯不合。而且,在快速的数据输入中不能用回车键来按下这个按钮却要用鼠标来点击也有违当初我们要快速这样一个目的。所以,还得对以上代码做适当的修改。代码如下。 在这里增加了对当前焦点控件类的判断,即如果当前控件是按钮(button)那么就不执行焦点跳转而是构造一条wm_command消息发送给程序,让程序以为是鼠标点击了该按钮。从而执行了这个按钮具有的功能而不是什么也不做的焦点转移。bool ckeydowndlg:pret

8、ranslatemessage(msg* pmsg) if (pmsg-message = wm_keydown & pmsg-wparam = vk_return) cwnd *wnd = getfocus (); if (wnd != null) char str256; cstring classname = _t(button); getclassname (wnd-m_hwnd, str, 256); if (classname = str) uint i = wnd-getdlgctrlid (); sendmessage (wm_command, i, (lparam)wnd-m

9、_hwnd); return true; cwnd *mwnd = getnextdlgtabitem (wnd); if (mwnd) mwnd-setfocus(); return true;return cdialog:pretranslatemessage(pmsg); HYPERLINK http:/ Windows CE/Windows Mobile开发常见问题解答怎样在一个控件获得焦点时打开软键盘?比如一个EditBox获得焦点后,这个时候自动打开软键盘,这样可以方便用户输入SIPINFO、SHSIPINFO、SIPSETINFO、SIPGETINFO里面有些参数弄不明白/隐藏输

10、入面板 BOOL LowerSip() BOOL fRes = FALSE; SIPINFO si; memset( &si, 0, sizeof( si ) ); si.cbSize = sizeof( si ); if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) ) si.fdwFlags &= SIPF_ON; fRes = SHSipInfo( SPI_SETSIPINFO, 0, &si, 0 ); return fRes; /升起输入面板 BOOL RaiseSip( void ) BOOL fRes = FALSE; SIPINFO si; m

11、emset( &si, 0, sizeof( si ) ); si.cbSize = sizeof( si ); if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) ) si.fdwFlags |= SIPF_ON; fRes = SHSipInfo( SPI_SETSIPINFO, 0, &si, 0 ); return fRes; 再试试下面这些: /SHSipPreference(m_hWnd, SIP_UP);/弹出输入面板 /SHSipPreference(m_hWnd, SIP_DOWN);/隐藏输入面板(有一个时延) /SHSipPreferen

12、ce(m_hWnd, SIP_FORCEDOWN );/隐藏输入面板(立即) /SHSipPreference(m_hWnd, SIP_UNCHANGED ); /一般只用在调用SIP_DOWN时的的后面,使这个命令无效-2.WinCE下字符串-数字转化的问题!在VC6.0下,把#include 、#include 两个文件包括进去后,下面这段代码一点问题没有, CString str1,str2; str1=123; str2=123.4; int i; float j; i=atoi(str1); j=atof(str2); 但是在EVC3.0里面,却出现了问题:提示atof没有定义,at

13、oi也不能正常转化。用wcstoi,wcstof, wcstol和wcstod-3. 我新拿了一个Pocket Pc,编了几个程序,但发现对话框都只能全屏显示,这是为什么?一般在Pocket PC中所有的对话框都是全屏显示,这是操作系统规定的行为。但如使用系统自定义的信息提示框,则不是全屏显示。如: Afxmessagebox所激发的提示框就是如此。 可以重载WM_INITDIALOG消息 MSDN: The DialogBox macro uses the CreateWindowEx function to create the dialog box. DialogBox then sen

14、ds a WM_INITDIALOG message to the dialog box procedure. The function displays the dialog box (regardless of whether the template specifies the WS_VISIBLE style), disables the owner window, and starts its own message loop to retrieve and dispatch messages for the dialog box.就是说当对话框窗口创建完以后,会发出一个WM_INI

15、TDIALOG 消息,你只要在自己的窗口消息处理函数里对这个消息进行处理,就可以了 比如:case WM_INITDIALOG: / Create a Done button and size it. shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN; shidi.hDlg = hDlg; SHInitDialog(&shidi); InitOptionDlg(hDlg); return TRUE;主要就是修改shidi.dwFla

16、gs ,看看ABOUT的窗口消息处理吧 补充: SHINITDLGINFO shidi; SHINITDLGINFO shidi; 上面说的是在纯API的程序中的方法 对于MFC创建的DIALOG程序,可以这样:BOOL CXXXDlg:OnInitDialog() SHINITDLGINFO shidi; HWND hDlg = m_hWnd; / Create a Done button and size it. shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_SIPDOWN ; shidi.hDlg = hDlg; SHInitDi

17、alog(&shidi); /InitOptionDlg(hDlg); /CDialog:OnInitDialog(); -4.在eVC基于MFC的程序中如何将ToolBar栏隐藏关于ToolBar的隐藏: 首先,如果你是用MFC向导创建的工程,则默认会生成ToolBar,我要说的是,干掉它!自己来创建。:) First,声明CToolBar成员变量: CToolBar * d_pToolbar2; 然后 static UINT BASED_CODE Toolbar2Buttons = / 下面是工具栏对应菜单的ID,工具栏图标是我弄的一个Bitmap,其ID为IDR_ADD_TOOLBAR

18、ID_FILE_NEW, ID_FILE_OPEN, ID_FILE_SAVE, ID_SEPARATOR, ID_EDIT_CUT, ID_EDIT_COPY, ID_EDIT_PASTE, ID_SEPARATOR, ID_TRANS_DICT, ID_TOOLBAR_SHOW, /这是新加入的菜单项,点击隐藏工具栏,再点击就显示工具栏 ; 然后 在CMainFrame的OnCreate()中加入: OnToolbarCreate(); 然后 void CMainFrame:OnToolbarCreate() / Should only get here if we dont have a

19、 toolbar. ASSERT(d_pToolbar2 = 0); / Create C+ object and WinAPI window. d_pToolbar2 = new CToolBar(); d_pToolbar2-Create(this, WS_CHILD | CBRS_BOTTOM | CBRS_SIZE_FIXED | CBRS_FLOATING, 0 x9100); / Get bitmap and connect to tool items. d_pToolbar2-LoadBitmap(IDR_ADD_TOOLBAR); d_pToolbar2-SetButtons(

20、Toolbar2Buttons, sizeof(Toolbar2Buttons)/sizeof(UINT); / Make toolbar dockable. d_pToolbar2-EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(d_pToolbar2); 然后 void CMainFrame:OnToolbarShow() ASSERT(d_pToolbar2 != 0);/ Query current visibility. BOOL bVisible = (d_pToolbar2-

21、GetStyle() & WS_VISIBLE);/ Show or hide. int nShow = (bVisible) ? SW_HIDE : SW_SHOWNORMAL; d_pToolbar2-ShowWindow(nShow);/ Reconfigure remaining toolbar items. RecalcLayout();/ Store visibility state for later. d_bToolbarVisible = (!bVisible); void CMainFrame:OnUpdateToolbarShow(CCmdUI* pCmdUI) /Thi

22、s function is signed for checking the menu Edit|Show Toolbar pCmdUI-Enable(d_pToolbar2 != 0); int nCheck = (d_bToolbarVisible) ? 1 : 0; pCmdUI-SetCheck(nCheck); ,默认情况下ToolBar是隐藏的,点击菜单中的新加入的隐藏/显示工具栏命令即可来回切换了。-5.如何制作pocket Pc 下的安装程序?在C:Windows CE Toolswce300MS Pocket PCsupportActiveSyncwindows ce appl

23、ication installation 下面有例子. 也有其它第三方的安装工具,比如installshield。-6.怎样在主界面中显示一幅图片我做了一个小程序, 想在主界面中显示一幅图片,我的图片是.JPG格式的,如果需要转换,用什么工具?把JPG图转为BMP图咯,网上有不少这样的程序。 然后用LoadBitmap、SelectObject、StretchBlt等语句把BMP图显示到VIEW中。-7. 请问,在WinCE下如何截获所有鼠标和键盘的消息?wince下只能用三种钩子 #define WH_JOURNALRECORD 0 #define WH_JOURNALPLAYBACK 1

24、#define WH_KEYBOARD_LL 20-8.在Pocket PC下用eVC作的对话框能否做成不是全屏的?在MFC中m_bFullScreen = FALSE;-9.如何将char 类型的中文字符串转换成Unicode的字符串?MultiByteToWideChar,在仿真器中无效;你也可以通过其他方法;用wcsprintf这个函数-10. evc单文档界面中,菜单左边总有一个new,如何将其去掉?在MainFrm的OnCreate内找到这个: m_wndCommandBar.m_bShowSharedNewButton = TRUE; 把TRUE改为FALSE-11.Edit出现上

25、下文菜单问题?近来我看了一下SDK带的Sample中的Npp,其中它有一个功能就是在EDIT上出现上下文菜单,可是当我仿照它在自己的项目中添加此功能时,即在资源中添加CONTROL ,IDC_STATIC,SIPPREF,NOT WS_VISIBLE,-10,-10、,6,6,在模拟器中正常,但在PDA中不能显示包含Edit的对话框。而Npp可以在两者正常显示。我又在Npp中增加一个对话框,也相应的改变资源,结果是在模拟器和PDA中都能正常显示。调用SHInitExtraControls()应该在构造函数,不应在OnInitDialog中。如果在OnInitDialog中调用,包含EDIT的对

26、话框将不显示。 事实上在XXXApp:InitInstance函数中调用更好,这样只需调用一次,就万事大吉。-12. 如何将.mdb数据库转换为.cdb数据库如何将.mdb数据库转换为.cdb数据库,在没有实际PDA,只有Pocket PC Emuliation和EVB的情况下。 Pocket PC Emuliation运行时为何提示“存储器不足,无法完成操作”?此问题微软已经给出了答案。 在SDK文档中有一个叫做device的例子程序,它就是将tdb文件转化成cdb文件的,而还有一个desktop的程序,它是将mdb文件转化成tdb文件的。-13.请问如何用EVC建立和调用DLL我按照帮助中

27、用MFC开发DLL的例子做,但是另外一个程序调用的时候的时候却出现连接错误,说找不到那个函数。后来看了EVC的例子spintest之后也是这样。和在WINDOWS下的一样 是不是LINK2001 ERROR? 你如果是隐式调用(就是不用LOADLIBRARY()的),要把你的DLL的LIB文件在PROJECT-SETTINGS-LINK-INPUT里指明。-14.编辑框如何自动会换行 ?请教,Plam中的table控件,在Wince上怎么做? 就是编辑框自动会换行.当你输入的内容超过一行,自动切换到下一行,下面的内容自动往下滚。勾选编辑控件的MultiLine,如果想输入回车换行,再勾选wan

28、t renturn-15.是否在adoce,pocket access中的update语句不能执行?ADOCE不能直接执行Update语句,但ADOCE有Update方法,你可用它实现。-16.请问如何在Windows CE中实现BC+中的inport(.)与outportb(.)函数功能?CE下,可以用WINDOWS API函数来对端口操作。 比较简单。 API一般只要用到CreateFile(打开端口,串口操作和文件操作只有一点不同就是打开方式不同,所以第三个参数要用 OPEN_EXISTING ) COMMTIMEOUTS、DCB两个结构是存放设置参数的,可以改 WriteFile、Wr

29、iteFile(读写端口) 因为串口通讯用的是异步通讯,所以下面两句比较重要 SetCommMask(指定监视的端口事件) WaitCommEvent(等待端口事件)-17. 如何显示一个对话框让用户选择一个目录而不是文件没有标准的函数处理这个,你只好自己实现活使用第三方的解决方案。-18.有没有办法(API)激活或禁止电源保存模式?参看SystemIdleTimerReset()的安装文档。创建一个包含象睡眠的无限循环的线程,然后调用SystemIdleTimerReset()。也许有一种中断线程的办法就是程序退出。-19. Windows CE的文件名最小程度是多少?在windef.h定义

30、了MAX_PATH,普遍应该是260个字符。20. 我使用CFileDialog创建了一个浏览按钮,默认目录始终是显示All Folders和在My DeviceMy do*ents下。怎样改变初始目录到My Device。使用fileDlg.m_ofn.lpstrInitialDir = TEXT(file:/My/ Device);,但是没有改变默认显示的目录。lpstrInitialDir指向一个指定初始文件目录的字符串。如果为NULL,将使用系统的根目录。尽量尝试一下lpstrInitialDir为NULL。-21.在Pocket PC任务栏上可能有X和OK按钮吗?不可能,至少没有象W

31、isBar的第三方工具。-22.如何禁止用户改变日期和时间?有可能实现吗?你可能用自己的程序替代windowsclock.exe,但是,它们可以通过另外的程序处理这个。同样,在同步时ActiveSync改变设备的时间与PC匹配。-23.我有一个xscal cpu的ipaq 3970设备,但是在eMbedded Visual C+ 3.0上没有目标类型。我应该在EVC3.0上使用什么类型。这个问题也发生在安装程序Cabwiz.exe上。你可以使用ARM类型。XScal基于ARM体系。-24.如何使程序在后台运行?最小化程序将使程序进入后台,因此只要在程序启动时最小化,那么它将运行在后台。补充:还

32、可以做成service。-25.我准备去掉SIP按钮。我在OnInitDialog事件中使用SHFullScreen。然而SIP按钮仍然可见,忘记做什么了吗?代码如下:/ SHFullScreen fails if dialog box is not foreground. SetForegroundWindow(); / Go to the full screen mode SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);不能在OnInitDialog中使用SHFullScreen,因为对话框还没有可见。你应该传递一

33、个自定义消息,在那个消息调用这个函数。也许下面这段代码会有用:void PFCSipButtonShow( BOOL bShow ) HWND hWnd = :FindWindow( _T( MS_SIPBUTTON ), NULL ); if (hWnd = NULL) return;if (bShow) :ShowWindow( hWnd, SW_SHOW ); else :ShowWindow( hWnd, SW_HIDE ); / PFCSipButtonShow-26. 如何在Pocket PC2002模拟器上安装Pocket PC程序?PPC2002模拟器没有模拟ARM处理器,因此

34、你必须有x86 CPU的二进制文件和相应的安装程序。只需使用文件浏览器复制cab文件到模拟器,然后执行它。商业程序的安装包通常不包含x86的二进制程序。如果你没有x86处理器的程序发布版本,你不能做这个安装。如果程序是你自己的,你可以创建一个x86的版本,之后创建一个安装CAB。-27.如何在eVC程序中读取普通的图标文件?在PC程序中使用ExtractIconEx(),但是在Pocket 设备好象不工作。缺少了什么?PC图标文件在Pocket PC环境是非法的?或者需要转换格式?不幸的是,在Pocket PC上没有API去读取图标。因此,你不得不手工解析图标文件。-28. 如何绘制一个透明的

35、圆呢?我想使用eVC+和GDI在Pocket PC 2002上绘制一个圆。我使用它绘制了直线,它处理的很好:hbrOld =(HBRUSH) SelectObject(hDC, CreatePatternBrush(RGB(0,255,0); hpnOld =(HPEN) SelectObject(hDC, CreatePen(PS_SOLID, 2, RGB(255,0,0); Ellipse( hDC, 10, 10, 20, 20); DeleteObject( SelectObject (hDC, hbrOld) ); DeleteObject( SelectObject (hDC,

36、hpnOld) );但是如何绘制一个透明的圆呢?有PS_NULL这样画笔类型吗?可以使用GetStockObject()得到一个NULL_BRUSH或HOLLOW_BRUSH(这两个是相同的)。然后用SelectObject选择它,就象你已经做的那样。-29.假定我知道程序的名称,关闭运行着的eVC的程序使用什么API?如果你知道程序的名称,并且假定与主窗口的名称相同,那么你可以使用FindWindow得到那个窗口的句柄,然后传送WM_CLOSE消息到那个窗口。HWND hwnd = FindWindow(NULL, _T(APPLICATION NAME); if ( hwnd) PostM

37、essage(hwnd, WM_DESTROY, 0, 0);-30.如何从PC设置PDA的时间?最简单的办法是写一个自定义的RAPI函数,通过CeRapi调用设备的SetSystemTime.-31.怎样使用WriteBinary,我不明白第二个参数(LPBYTE):BOOL CVORegistry:WriteBinary(LPCTSTR pcszKey, LPBYTE pData, DWORD cbData)第二个参数是指向包含你想写到注册表的二进制数据的缓冲。BYTE data = 0 x12, 0 x34, 0 x56, 0 x78, 0 x90, 0 xab, 0 xcd, 0 xe

38、f ; extern CVORegistry reg; reg.WriteData(_T(BinaryData), data, sizeof(data);-32.Windows CE支持钩子API吗?这样我们可以监视需要的时间。如果支持,用法也象Windows 2000那样吗?坏消息:CE不支持钩子。系统不支持,我们还是可以想其他办法的-33.我不能使用Pocket PC上CDialog的TitleBar,我能用静态文本框控件替代,使之与TitleBar相似。有办法显示TitleBar吗?大多数Pocket PC上的对话框是全屏的,没有自己的主题栏,而是使用系统任务栏。你可以创建一个非全屏对话

39、框(象消息框那样)。-34.如何在程序中关闭(suspend)Pocekt PC?方法1:虚拟关机键 :keybd_event(VK_OFF, 0, 0, 0); :keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);方法2:调用未公开函数PowerOffSystem() extern C _declspec(dllimport) void PowerOffSystem();-35.如何在程序中重启(soft reset)Pocket PC?#include #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL,

40、15, METHOD_BUFFERED, FILE_ANY_ACCESS) extern C _declspec(dllimport) BOOL KernelIoControl( DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned); BOOL ResetPocketPC() return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL); -36.

41、 如何在程序中硬启动(hardware reset)Pocekt PC?注意:使用此段代码会将您的Pocket PC的用户数据全部清空。#include #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) extern C _declspec(dllimport)void SetCleanRebootFlag(void); extern C _declspec(dllimport) BOOL KernelIoControl( DWORD dwIoControlCode,

42、 LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned); BOOL HardResetPocketPC() SetCleanRebootFlag(); return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL); -37.以下方法信息不全,无法使用:1.系统不认识VK_OFF2.使用哪个dll 和 lib文件?如何在程序中关闭(suspend)Pocekt PC?方法1:虚拟关机键 :key

43、bd_event(VK_OFF, 0, 0, 0); :keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);方法2:调用未公开函数PowerOffSystem() extern C _declspec(dllimport) void PowerOffSystem();关闭(suspend) 方法1: /虚拟关机键 :keybd_event(VK_OFF, 0, 0, 0); :keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);方法2: /调用未公开函数PowerOffSystem() extern C _declspec(d

44、llimport) void PowerOffSystem(); HYPERLINK http:/ PocketPC基于对话框的MFC应用程序全屏方法 作者:Zhiheng 日期:2009-09-091、在OnInitDialog()中加入如下语句:RECT rc;GetWindowRect(&rc);rc.top -= 26; 1、在OnInitDialog()中加入如下语句:RECT rc;GetWindowRect(&rc);rc.top -= 26;MoveWindow(rc.left,rc.top,rc.right,rc.bottom,FALSE); /上移26像素SHFullScr

45、een(this-m_hWnd,SHFS_HIDETASKBAR); /隐藏任务栏该段代码为:将整个窗口向上平移26个像素以到达屏幕顶部,同时使用SHFullScreen()隐藏任务栏。或者:先把该Dialog的TitleBar属性置为false,然后在OnInitDialog()函数中加入如下语句:int iFullWidth = GetSystemMetrics(SM_CXSCREEN); int iFullHeight = GetSystemMetrics(SM_CYSCREEN);:SetWindowPos(this-m_hWnd, HWND_TOPMOST, 0, 0, iFullW

46、idth, iFullHeight, SWP_NOOWNERZORDER|SWP_SHOWWINDOW);2、由于调用输入法面板(Input Panel)时,任务栏会再次出现(依据MSDN,在Input Panel活动时会发送WM_SETTING_CHANGE和WM_ACTIVATE两个消息。因此需要手工来处理这两个消息来保持全屏),需要添加以下2个消息:(1)选择改dlg类,在属性中添加WM_SETTINGCHANGE和WM_ACTIVATE消息。即public:afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);pu

47、blic:afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);void CtestDlg:OnSettingChange(UINT uFlags, LPCTSTR lpszSection)/CDialog:OnSettingChange(uFlags, lpszSection); /注释该行/ TODO: 在此处添加消息处理程序代码void CtestDlg:OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)CWnd:OnActivate(n

48、State, pWndOther, bMinimized);/CDialog改为CWnd/ TODO: 在此处添加消息处理程序代码SHFullScreen( this-m_hWnd, SHFS_HIDETASKBAR);直接隐藏TitleBar和任务栏:1、 SetForegroundWindow(); SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON); SHFullScreen(m_hWnd, SHFS_HIDETASKBAR); SHFullScreen(m_hWnd, SHFS_HIDESTARTICON);2、CWnd* pWndSIP = FindWi

49、ndow( _T(menu_worker), 0 ); if ( pWndSIP ) pWndSIP-SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); pWndSIP-ShowWindow(SW_HIDE); pWndSIP = FindWindow( _T(MS_SIPBUTTON), 0 ); if ( pWndSIP ) pWndSIP-SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); pWndSIP-ShowWindow(SW_HI

50、DE); pWndSIP = FindWindow( _T(HHTaskBar), 0 ); if ( pWndSIP ) pWndSIP-SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); pWndSIP-ShowWindow(SW_HIDE); 问题:如何让WINCE系统启动直接运行自己的程序方法:1. 假定Windows CE.NET目标工程目录为D:WINCE420PUBLICMyWinCE,并且工程已经Build成功,假定Windows CE.NET的应用程序为MyApp.exe;2. 将MyApp.exe复

51、制到D:WINCE420PUBLICMyWinCESAMSUNG_SMDK2410_ARMV4Release目录下; 3. 修改MyWinCE工程的project.bib文件,在FILES Section添加如下内容:MyApp.exe $(_FLATRELEASEDIR)MyApp.exe NK H 4. 创建快捷方式文件MyApp.lnk,文件内容如下:10#WindowsMyApp.exe MyApp.lnk文件也放入D:WINCE420PUBLICMyWinCESAMSUNG_SMDK2410_ARMV4Release目录下;5. 修改MyWinCE工程的project.bib文件,在

52、FILES Section添加如下内容:MyApp.lnk $(_FLATRELEASEDIR)MyApp.lnk NK H 6. 修改MyWinCE工程的project.dat文件,添加如下内容: Directory(WindowsStartup):-File(MyApp.lnk,WindowsMyApp.lnk) 7. 修改MyWinCE工程的platform.bib文件,在FILES Section添加如下内容: MyApp.exe $(_FLATRELEASEDIR)MyApp.exe NK HMyApp.lnk $(_FLATRELEASEDIR)MyApp.lnk NK H8. P

53、latform Builder IDE:【Build】-【Make Image】(记得千万不要Build或者Rebuild)9. 成功后,得到的NK.bin(或NK.nb0)就包含了应用程序MyApp.exe和MyApp.lnk,当把相应的内核烧入开发板MyApp程序就会在系统启动时自动运行。虽然MyApp可以自己启动了,但每次启动的时候,总是微软的桌面先出来,再启动我们的程序,感觉还是不伦不类。对此,我们可以使用startup的快捷方式再加上隐藏任务栏的方法,效果非常的好,具体操作是:1) 首先新建工程,把你的应用程序放到内核里面去(前面介绍了如何做);2) 编译平台;3) 修改shell.

54、reg的文件:在文件中有这样一行:HKEY_LOCAL_MACHINEinitLaunch50=explorer.exeDepend50=hex:14,00, 1e,00把这个explorer.exe改成你的应用程序(比如:MyApp.exe)就可以了;4) Platform Builder IDE:【Build】-【Make Image】(记得千万不要Build或者Rebuild)5) 成功后,得到的NK.bin(或NK.nb0)就包含了应用程序MyApp.exe和MyApp.lnk,当把相应的内核烧入开发板MyApp程序就会在系统启动时自动运行。 HYPERLINK /fdmbs/arti

55、cle/details/6080208 Wince上造背景透明的控件 2010-12-16 15:25 267人阅读 HYPERLINK /fdmbs/article/details/6080208 l comments#comments 评论(1) HYPERLINK javascript:void(0); o 收藏 收藏 HYPERLINK /fdmbs/article/details/6080208 l report#report o 举报 举报 在Wince上造背景透明的控件 在非纯色背景上,叠加背景透明的BUTTON和STATIC_TEXT控件 收藏 例子:我们要把这个十字准星叠到一

56、个BUTTON控件上,BUTTON位于一个非纯色的背景的窗口上。显示时,紫红色(RGB 0 xFF00FF)区域要被挖去,而显示底下的背景。资源图片如下图实现:1、按照以前的经验,如果这个Button由我们自己CreateWindowEx建立起来的话,只要在RegisterClass的WNDCLASS结构体里,把HBRUSH设置成GetStockObject(NULL_BRUSH),并且在WM_PAINT消息里首先做SetBkMode(TRANSPARENT)就可以了。但由于现在走了GWES和eVC里RESOURCE文件结合的方法提高开发速度,所以我们不能回到自己CreateWindow的原始

57、时代了。应该考虑在MS制定的GWES游戏规则里跳舞。2、首先实现图片的去色。实际上很容易,从网上的资料看,以前还得做个单色“掩色”hdc, 然后怎么怎么处理。而WINCE已经把这个功能做好了,提供函数TransparentBlt。现在我画上去的按钮成这样了:问题很明显,图像本身是达到去色的目的了,但是按钮的背景仍然是灰色刷子刷出来的,必须把按钮背景变成透明的。2、首先我想到在WM_DRAWITEM消息里做SekBkMode,没有效果。然后非常想把已注册的WNDCLASS改掉,于是找到函数SetClassLong和GetClassLong,并且INDEX参数给出了GCL_HBRBACKGROUN

58、D类型。一切看起来都很美好。于是我写了这样的代码HBRUSH hbr = GetStockObject(NULL_BRUSH);int nReturn = SetWindowLong(hWnd, GCL_HBRBACKGROUND, (int)hbr);结果编译不让过,说没有GCL_HBRBACKGROUND这个东东。我查了下STANDARDSDK_500给出的头文件,里面的确没有GCL_HBRBACKGROUND的定义。于是干脆翻出VS2005在XP下的SDK,硬是找到了GCL_HBRBACKGROUND = (-10). 好,我就强制SetWindowLong(hWnd, -10, (in

59、t)hbr)结果编译过去了,运行起来nReturn = 0. 伤心啊。再试一把,HBRUSH hbr = GetWindowLong(hwnd, -10)运行结果hbr = NULL. 伤心啊,拔凉拔凉的啊。仔细看WINCE产品文档,虽然对用表格列出了一大堆nIndex,但是下面小字Remarks写了“The only values supported for the nIndex parameter are GCL_HICON and GCL_STYLE”,最多再加个GCL_HCURSOR,其他的参数类型WINCE都不支持。我日,浪费感情。3、在父窗口的PROC里抓住WM_CTLCOLORB

60、TN消息,在里面搞点鬼case WM_CTLCOLORBTN:HBRUSH hbr = (HBRUSH)GetStockObject(NULL_BRUSH);SetBkMode( HDC(wParam), TRANSPARENT );return (int)hbr;郁闷了,父窗口不画这个区域,BUTTON自己又不擦背景,桌面的字都透出来了。像下图这样:然后我画了个把小时搞InvalidateRect, ValidateRect, 对着那点小地方折腾半天,父窗口还是不愿意画上子窗口的区域,真像开工作会议时的扯皮,不是本部门负责的区域,坚决不做,打死也不做。这就是为什么文章标题强调“非纯色背景”了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论