=============================================================
标题:资源脚本
备注:参考《Windows CE 6.0开发者参考》
日期:2011.4.1
姓名:朱铭雷
=============================================================
主要功能
用来存放对话框,字符串,位图,图标,菜单等资源数据。因为资源不需编译,所以可直接修改资源而无需重新编译整个应用程序。
菜单
ID_MENU MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New", IDM_NEW
MENUITEM "&Open", IDM_OPEN
MENUITEM SEPARATOR
MENUITEM "&Exit", IDM_EXIT
END
END
ID_MENU是资源ID,接着MENU是资源类型,DISCARDABLE关键字告诉系统在该资源没被用到时可以从内存中删除。POPUP指明File菜单项是附加在主菜单上的弹出式菜单。&后面的字符作为加速键分配给这个菜单项。语法比较清晰,很容易看懂。
在代码中使用该菜单资源:
HMENU hMenuMain, hMenu;
MapWindowPoints (hWnd, HWND_DESKTOP, &pt, 1);
pt.x += 5;
hMenuMain = LoadMenu (hInst, MAKEINTRESOURCE (ID_MENU));
hMenu = GetSubMenu (hMenuMain, 0);
TPMPARAMS tpm;
tpm.cbSize = sizeof (tpm);
GetClientRect (hWnd, &tpm.rcExclude);
TrackPopupMenuEx (hMenu, TPM_LEFTALIGN | TPM_TOPALIGN,
pt.x, pt.y, hWnd, &tpm);
DestroyMenu (hMenuMain);
DestroyMenu (hMenu);
图标
ID_ICON ICON "res//WRENCH.ICO"
在代码中使用该图标资源:
HICON hIcon = (HICON)SendMessage(hWnd, WM_GETICON, FALSE, 0);
if (hIcon == 0)
{
hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(ID_ICON), IMAGE_ICON, 16, 16, 0);
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
}
这段代码的功能是给窗口分配图标。
加速键
提供一种直接的方法,使一个按键组合可以触发WM_COMMAND消息并发送到一个窗口。
ID_ACCEL ACCELERATORS DISCARDABLE
BEGIN
"E", IDM_EXIT, VIRTKEY, CONTROL
END
VIRTKEY代表这个字实际上是虚拟键,CONTROL表示Ctrl键必须同时按下。
在代码中使用该加速键资源:
HACCEL hAccel;
hAccel = LoadAccelerators (hInst, MAKEINTRESOURCE (ID_ACCEL));
MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
// Translate accelerators
if (!TranslateAccelerator (hwndMain, hAccel, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
这段代码首先加载加速键表,然后对消息循环做简单修改,以使加速键起作用。
位图
IDB_BITMAP BITMAP "res//abc.bmp"
在代码中使用该位图资源:
RECT rect;
GetClientRect (hWnd, &rect);
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint (hWnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, 20, 20);
HBITMAP hOldMemBmp = (HBITMAP)SelectObject(hdcMem,hBitmap);
HDC hdcBmp = CreateCompatibleDC(hdc);
HANDLE hBmpDis = LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP), IMAGE_BITMAP, 0, 0, 0);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hdcBmp,hBmpDis);
BitBlt(hdcMem, 0, 0, 20, 20, hdcBmp, 0, 0, SRCCOPY);
BitBlt(hdc, 0, 0, 20, 20, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcBmp,hOldBmp);
SelectObject(hdcMem,hOldMemBmp);
DeleteObject(hBitmap);
DeleteDC(hdcMem);
DeleteDC(hdcBmp);
EndPaint (hWnd, &ps);
这段代码采用双缓存绘制位图。
字符串
STRINGTABLE DISCARDABLE
BEGIN
IDS_TEXT1, "Hello "
IDS_TEXT2, "Windows CE!"
END
在代码中使用该字符串资源:
PBYTE pRes, pBuff;
int nStrLen = 0, i = 0;
pBuff = (PBYTE)LocalAlloc (LPTR, 8);
while (pRes = (PBYTE)LoadString (hInst, IDS_TEXT1 + i++, NULL, 0))
{
// Get the length of the string resource
int nLen = *(PWORD)(pRes-2) * sizeof (TCHAR);
// Resize buffer
pBuff = (PBYTE)LocalReAlloc (pBuff, nStrLen + 8 + nLen, LMEM_MOVEABLE | LMEM_ZEROINIT);
if (pBuff == NULL) return 0;
// Copy resource into buffer
memcpy (pBuff + nStrLen, pRes, nLen);
nStrLen += nLen;
}
*(TCHAR *)(pBuff + nStrLen) = TEXT ('/0');
LPTSTR pszText;
pszText = (LPTSTR)pBuff;
DrawText (hdc, pszText, -1, &rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
这段代码输出字符串Hello Windows CE!
完整测试程序
HelloCE.rc
#include "windows.h"
#include "HelloCE.h"
//----------------------------------------------------------------------
// Main window dialog template
//
ProgWinCE DIALOG discardable 10, 10, 120, 65
STYLE WS_OVERLAPPED | WS_VISIBLE | WS_CAPTION | WS_SYSMENU |
DS_CENTER | DS_MODALFRAME
CAPTION "ProgWinCE"
BEGIN
LISTBOX IDD_NETLIST, 2, 2, 116, 46,
WS_TABSTOP | WS_VSCROLL |
LBS_NOINTEGRALHEIGHT | LBS_USETABSTOPS
PUSHBUTTON "Exit", IDC_EXIT, 2, 50, 55, 12, WS_TABSTOP
END
//----------------------------------------------------------------------
// Menu
//
ID_MENU MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New", IDM_NEW
MENUITEM "&Open", IDM_OPEN
MENUITEM SEPARATOR
MENUITEM "&Exit", IDM_EXIT
END
END
//----------------------------------------------------------------------
// Icon
//
ID_ICON ICON "res//WRENCH.ICO"
//----------------------------------------------------------------------
// Accelorator
//
ID_ACCEL ACCELERATORS DISCARDABLE
BEGIN
"E", IDM_EXIT, VIRTKEY, CONTROL
END
//----------------------------------------------------------------------
// Bitmap
//
IDB_BITMAP BITMAP "res//abc.bmp"
//----------------------------------------------------------------------
// String table
//
STRINGTABLE DISCARDABLE
BEGIN
IDS_TEXT1, "Hello "
IDS_TEXT2, "Windows CE!"
END
HelloCE.h
#define ID_MENU 10
#define IDM_NEW 100
#define IDM_OPEN 101
#define IDM_EXIT 102
#define ID_ICON 11
#define ID_ACCEL 12
#define IDB_BITMAP 13
#define IDS_TEXT1 14
#define IDS_TEXT2 15
#define IDD_NETLIST 103
#define IDC_EXIT 104
// Returns number of elements
#define dim(x) (sizeof(x) / sizeof(x[0]))
//----------------------------------------------------------------------
// Generic defines and data types
//
struct decodeUINT
{ // Structure associates
UINT Code; // messages
LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM);// with a function.
};
struct decodeCMD
{ // Structure associates
UINT Code; // menu IDs
LRESULT (*Fxn)(HWND, WORD, HWND, WORD); // with a function
};
//----------------------------------------------------------------------
// Function prototypes
//
HWND InitInstance (HINSTANCE, LPWSTR, int);
int TermInstance (HINSTANCE, int);
int ShowContextMenu (HWND hWnd, POINT pt);
// Window procedures
LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);
// Message handlers
LRESULT DoPaintMain (HWND, UINT, WPARAM, LPARAM);
LRESULT DoDestroyMain (HWND, UINT, WPARAM, LPARAM);
LRESULT DoLButtonDownMain (HWND, UINT, WPARAM, LPARAM);
LRESULT DoCommandMain (HWND, UINT, WPARAM, LPARAM);
// Command functions
LPARAM DoMainCommandExit (HWND, WORD, HWND, WORD);
HelloCE.cpp
#include <windows.h>
#include "helloce.h"
#include <aygshell.h>
#pragma comment( lib, "aygshell" )
//----------------------------------------------------------------------
// Global data
//
const TCHAR szAppName[] = TEXT("ProgWinCE");
HINSTANCE hInst; // Program instance handle
LPTSTR pszText;
// Message dispatch table for MainWindowProc
const struct decodeUINT MainMessages[] =
{
WM_PAINT, DoPaintMain,
WM_DESTROY, DoDestroyMain,
WM_LBUTTONDOWN, DoLButtonDownMain,
WM_COMMAND, DoCommandMain,
};
// Command Message dispatch for MainWindowProc
const struct decodeCMD MainCommandItems[] =
{
IDM_EXIT, DoMainCommandExit,
};
//======================================================================
// Program entry point
//
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,