1.获得子窗体的文字内容
char buff[100];
HWND parent = GetParent(hwnd); //通过子控件句柄获得父窗体句柄
SendDlgItemMessage(parent,IDC_STRING,MSG_GETTEXT,99,(LPARAM)buffer);
IDC_STRING为字窗体id值,MSG_GETTEXT为获得文本的消息,99为最大接收字符串
长度,buffer为存储接收到的字符
也可通过SendMessage(hWnd,MSG_GETTEXT,99,(LPARAM)buffer);来设置控件字体
也可用封装好的GetWindowText(hWnd,buff,maxlen);来得到字体
2.给窗体控件设置文本内容
char str[100];
sprintf(str,"%s","test text");
SetDlgItemText(hWnd,IDC_SELECTED,str); 其中hWnd为窗体句柄,IDC_SELECTED
为控件的id,str为要给空间添加的文本
也可通过SendMessage(hWnd,MSG_SETEXT,0,(LPARAM)buff);来设置控件字体
也可用封装好的SetWindowText(hWnd,buff);来设置控件字体
3.使用定时器
可在MSG_CREATE中通过 SetTimer(hWnd,IDC_TIMER,10);来创建和启动定时器,其中
hWnd为接收定时器的窗体,IDC_TIMER为定时器的id,10为定时器的定时时间,单位为10ms
在hWnd的过程回调函数中可通过MSG_TIMER:来处理定时器到达事件,最后在MSG_DESTROY
中调用KillTimer(hWnd,IDC_TIMER)来注销定时器
4.通过获得图片中某个位置的颜色值,来给控件设置背景色。
gal_pixel pixel; //存储获得的颜色值
pixel = GetPixelInBitmap(&bitmap,0,0); //获得bitmap图片中的(0,0)像素位的颜色值
SetWindowBkColor(hWnd,pixel); //给窗体或则控件设置背景色
InvalidateRect (hWnd, NULL, TRUE); //启动重绘窗体
5.设置编辑框只能输入数字或只能输入字母
#define IDC_CTRL1 100
#define IDC_CTRL2 110
static WNDPROC old_edit_proc;
以下可在MSG_CREATE中设置
HWND hWnd1, hWnd2
hWnd1 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_VISIBLE | WS_BORDER, IDC_CTRL1,
200, 10, 180, 24, hWnd, MY_ES_DIGIT_ONLY);
hWnd2 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_BORDER | WS_VISIBLE, IDC_CTRL2,
200, 40, 180, 24, hWnd, MY_ES_ALPHA_ONLY);
old_edit_proc = SetWindowCallbackProc (hWnd1, RestrictedEditBox);
SetWindowCallbackProc (hWnd2, RestrictedEditBox);
以下为限制输入的回调函数
static int RestrictedEditBox (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
if (message == MSG_CHAR) {
DWORD my_style = GetWindowAdditionalData (hwnd);
if ((my_style & MY_ES_DIGIT_ONLY) && (wParam < '0' || wParam > '9'))
return 0;
else if (my_style & MY_ES_ALPHA_ONLY)
if (!((wParam >= 'A' && wParam <= 'Z') || (wParam >= 'a' && wParam <= 'z')))
return 0;
}
return (*old_edit_proc) (hwnd, message, wParam, lParam);
}
6.设置鼠标移到控件上时,显示控件提示信息
static WNDPROC old_btn_proc; //为全局静态
static HWND g_hTooltip; //提示框的句柄
static HWND s_hStart; //局部静态
g_hTooltip = CreateToolTipWin (hWnd, 0, 0, 1000, ""); //hWnd为主窗体句柄,0,0为ToolTip显示的位置,1000为ToolTip显示的时间单位为ms,""为文本显示的的格式,成功返回提示框的句柄
SetWindowElementAttr (g_hTooltip, WE_LFSKIN_WND_BKGND, 0L); //设置提示框显示属性
SetWindowBkColor (g_hTooltip, PIXEL_green); //设置背景提示框颜色
ShowWindow (g_hTooltip, SW_HIDE); //开始隐藏
s_hStart = CreateWindowEx (CTRL_BUTTON, "", //创建一个提示框的按钮
WS_VISIBLE | BS_PUSHBUTTON, WS_EX_NONE,
IDC_START,
20, 96, 24, 24,
hWnd, (DWORD)"Start/Pause"); //最后的"Start/Pause"为提示的内容
old_btn_proc = SetWindowCallbackProc (s_hStart, DefButtonProc); //设置回到函数
//回调函数
static int DefButtonProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
if (message == MSG_ERASEBKGND) {
return 0;
}
else if (message == MSG_MOUSEMOVEIN) {
RECT rc;
BOOL in_out = (BOOL)wParam;
char *tip = (char *)GetWindowAdditionalData (hwnd); //获得"Start/Pause"提示字符串
if (NULL != tip && in_out) {
GetClientRect (hwnd, &rc);
ClientToScreen (hwnd, &rc.right, &rc.bottom);
ResetToolTipWin (g_hTooltip, rc.right, rc.bottom, tip);
}
}
return (*old_btn_proc) (hwnd, message, wParam, lParam);
}
7.注册工程所用图片和释放工程所用图片。可在MiniGuiMain主函数中注册,在循环突出结束时释放
#define NUM_48 "num_48.bmp" //定义图片名
#define ARRAY_LEN(array) \ //计算数字中存放的图片张数
(sizeof(array)/sizeof(array[0]))
static char* all_pic[] = { //存放图片路径的数组
NUM_48,
};
BOOL register_all_pic (void) //注册图片资源
{
int i;
SetResPath ("./img/");
for (i = 0; i < ARRAY_LEN(all_pic); i++)
{
if (RegisterResFromFile (HDC_SCREEN, all_pic[i]) == FALSE)
{
fprintf (stderr, "can't register %s\n", all_pic[i]);
return FALSE;
}
}
return TRUE;
}
SetDefaultWindowElementRenderer ("skin"); //在注册完图片后要调用这句函数来初始初始化全局图片,使其可以用
void unregister_all_pic (void) //释放图片资源
{
int i;
for (i = 0; i < ARRAY_LEN(all_pic); i++)
{
UnregisterRes(all_pic[i]);
}
}
8.使用自定义bmp图片字体
#define NUM_48_BMP "../KepBackMinigui/img/num_48.bmp" //①数字图片
#define DOT_48_BMP "../KepBackMinigui/img/dot_48.bmp" //①点图片
static BITMAP g_stBMPNumber; //①黑色数字图片
static BITMAP g_stBMPInsert; //①插入的黑色字符图片
static DEVFONT *s_bmpDevFont; //①bmp字体设备
static LOGFONT *s_bmpLogFont; //①bmp字体句柄
static int s_nTMin = 12; //①显示的数字1
static int s_nTSec = 20; //①显示的数字2
在MSG_CREATE:中
LoadBitmap (HDC_SCREEN, &g_stBMPNumber, NUM_48_BMP); //①加载数字图片
LoadBitmap (HDC_SCREEN, &g_stBMPInsert, DOT_48_BMP); //①加载小数点图片
s_bmpDevFont = CreateBMPDevFont ("bmp-led-rrncnn-20-48-ISO8859-1", //①创建一个BITMAP图片数字,数字像素为20*48
&g_stBMPNumber, "0", 10, 25); //①"0"表示从第“0”个字符开始,取10字符,由于我们给的num_48.bmp图片
//①像素为275*48的,里面又有11个字符,所以每个字符长度为 275/11 = 25
AddGlyphsToBMPFont (s_bmpDevFont, &g_stBMPInsert, ".", 1, 25); //①将新的bmp图片中的字符插入到s_bmpDevFont中
//①g_stBMPInsert为含有.字符的图片,"."代表插入
//①插入的第一个字符,1代表只有一个,25代表字符图片
//①像素宽度
s_bmpLogFont = CreateLogFont (FONT_TYPE_NAME_BITMAP_BMP, "led", //①通过前两步的设置,就可创建具体的bmp图片中字符操作
"ISO8859-1", //①句柄s_bmpLogFont了
FONT_WEIGHT_BOLD, FONT_SLANT_ITALIC,
FONT_SETWIDTH_NORMAL, FONT_SPACING_CHARCELL,
FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,
48, 0);
在MSG_PAINT:中
HDC hdc;
char cBuff[6];
hdc = BeginPaint (hWnd);
sprintf (cBuff, "%.2d.%.2d", s_nTMin, s_nTSec); //①②
cBuff [5] = '\0'; //①②
SelectFont (hdc, s_bmpLogFont); //①②设置hdc字体格式
TextOut (hdc, TIME_POS_X, TIME_POS_Y, cBuff); //①②显示出自定义的字体
EndPaint (hWnd, hdc);
return 0;
最后在MSG_DESTROY:中
UnloadBitmap(&g_stBMPNumber); //①卸载数字图片
UnloadBitmap(&g_stBMPInsert); //①卸载小数点图片
DestroyBMPFont (s_bmpDevFont); //①bmp字体资源回收
9.使按钮实现三态背景,即常态,鼠标悬停态,鼠标按下态
//图片要求,图片像素的宽要和按钮宽一样,图片竖值高度要为按钮高度的五倍,且竖值排放五种状态的按钮,第一张为正常状态的图片,第二张为鼠标悬停是的图片,第三张为按钮按下时的图片,第四五张不知干什么的,但位置要保留出来
#define LFSKIN_VOLUME "lfskin_Volume.gif" //②声音图片
#define LFSKIN_DISVOLUME "lfskin_DisVolume.gif" //②静音图片
#define IDC_VOLUME 100 //②声音按钮ID
#define MSG_CHANGE_SKINS (MSG_USER + 10) //②自定义消息
#define ARRAY_LEN(array) \
(sizeof(array)/sizeof(array[0])) //②计算数组长度的宏
static char* all_pic[] = { //②④图片数组
LFSKIN_VOLUME,
LFSKIN_DISVOLUME,
LFSKIN_MAIN,
};
static HWND s_hVolume; //②声音按钮句柄
static BOOL s_bVolume; //②声音按键按下弹起标志
在主函数内注册图片和销毁图片
register_all_pic(); //②④注册背景图片
SetDefaultWindowElementRenderer ("skin"); //②④默认背景风格
unregister_all_pic(); //②④注销背景图片
在MSG_CREATE中:
s_bVolume = TRUE; //②声音按键标志初始化为真
s_hVolume = CreateWindowEx (CTRL_BUTTON, "", //②创建测试的按钮
WS_VISIBLE | BS_PUSHBUTTON, WS_EX_NONE,
IDC_VOLUME,
150, 20, 40, 42,
hWnd, 0L);
SendMessage (hWnd, MSG_CHANGE_SKINS, 0, 0); //②发送自定义的消息设置按钮背景图片
在MSG_CHANGE_SKINS消息处理中
if (s_bVolume) //②
SetWindowElementAttr (s_hVolume, //②设置可用声音按钮背景,通过改参数WE_LFSKIN_PUSHBUTTON确定是可以三态选择的按钮
WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_VOLUME); //②
else
SetWindowElementAttr (s_hVolume, //②
WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_DISVOLUME); //②设置不可用声音按钮背景,通过改参数WE_LFSKIN_PUSHBUTTON确定是可以三态选择的按钮
InvalidateRect (s_hVolume, NULL, FALSE); //②只刷新声音按钮
UpdateWindow (hWnd, TRUE);
在MSG_COMMAD:中
int id = LOWORD(wParam);
switch(id)
{
case IDC_VOLUME: //②声音按钮处理
if (!s_bVolume) {
s_bVolume = TRUE; //②
SetWindowElementAttr (s_hVolume, //②
WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_VOLUME); //②设置三态背景图片
InvalidateRect (s_hVolume, NULL, FALSE); //②
}
else {
s_bVolume = FALSE; //②
SetWindowElementAttr (s_hVolume, //②
WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_DISVOLUME);//②设置三态背景图片
InvalidateRect (s_hVolume, NULL, FALSE); //②
}
break;
测试效果图