WinCE 开发自定义控件
来源:互联网 发布:java json转对象工具 编辑:程序博客网 时间:2024/05/17 23:09
最近项目需要在SmartPhone上实现一个HyperLink的功能,显然win32的控件里没有现成的,只有自己开发一个
首先注册一个窗口类
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
……
if (!HyperLinkRegisterClass(hInstance)
{
return FALSE;
}
……
}
ATOM HyperLinkRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = HyperLinkWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
//wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
//wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TEXT("CtlHyperLink");
return RegisterClass (&wndclass) ;
}
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
……
if (!HyperLinkRegisterClass(hInstance)
{
return FALSE;
}
……
}
ATOM HyperLinkRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = HyperLinkWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
//wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
//wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TEXT("CtlHyperLink");
return RegisterClass (&wndclass) ;
}
然后处理控件的各种消息达到自己想要的效果
LRESULT CALLBACK HyperLinkWndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
LONG ID;
switch (message)
{
case WM_PAINT:
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
{
pszText = HYPERLINK_CAPTION[i];
if(bHyperLinkSelect[i])
RenderHyperLink(hwnd,TRUE);
else
RenderHyperLink(hwnd,FALSE);
}
return 0 ;
case WM_SETFOCUS:
/*RenderHyperLink(hwnd,TRUE); */
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
{
bHyperLinkSelect[i] = TRUE;
}
InvalidateRect(hwnd, NULL, true);
SendMessage(hwnd, WM_PAINT, GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd);
return 0 ;
case WM_KILLFOCUS:
/*RenderHyperLink(hwnd,TRUE); */
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
{
bHyperLinkSelect[i] = FALSE;
}
InvalidateRect(hwnd, NULL, true);
SendMessage(hwnd, WM_PAINT, GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd);
return 0 ;
case WM_KEYUP:
if (wParam != VK_SPACE)
break ;// fall through
/*case WM_KEYUP:
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;
case WM_KEYDOWN:
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;*/
//case WM_KEYDOWN:
// return 0 ;
case WM_LBUTTONUP :
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
int RenderHyperLink(HWND hwnd,BOOL bSelect)
{
LOGFONT ft;
HFONT hFontNew, hFontOld;
HBRUSH hBrush;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
GetClientRect (hwnd, &rect);
hdc = BeginPaint (hwnd, &ps);
hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)) ;
hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
FillRect(hdc,&rect,hBrush);
memset(&ft, 0, sizeof(ft));
wcscpy(ft.lfFaceName, TEXT("宋体")); //fonttype
ft.lfHeight = 16; //fontsize
ft.lfUnderline = TRUE;
hFontNew = CreateFontIndirect(&ft);
hFontOld = (HFONT)SelectObject(hdc, hFontNew);
if(bSelect)
{
SetBkColor (hdc, GetSysColor (COLOR_WINDOW));
SetTextColor (hdc, (COLORREF)0x000000FF);
}
else
{
SetBkColor (hdc, GetSysColor (COLOR_WINDOW));
SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT));
}
DrawText (hdc, pszText, -1, &rect,
DT_SINGLELINE | DT_LEFT );
//SetWindowLong(hwnd,GWL_STYLE,WS_CAPTION);
SelectObject(hdc, hFontOld);
DeleteObject (SelectObject (hdc, hBrush)) ;
EndPaint (hwnd, &ps) ;
return 0;
}
{
LONG ID;
switch (message)
{
case WM_PAINT:
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
{
pszText = HYPERLINK_CAPTION[i];
if(bHyperLinkSelect[i])
RenderHyperLink(hwnd,TRUE);
else
RenderHyperLink(hwnd,FALSE);
}
return 0 ;
case WM_SETFOCUS:
/*RenderHyperLink(hwnd,TRUE); */
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
{
bHyperLinkSelect[i] = TRUE;
}
InvalidateRect(hwnd, NULL, true);
SendMessage(hwnd, WM_PAINT, GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd);
return 0 ;
case WM_KILLFOCUS:
/*RenderHyperLink(hwnd,TRUE); */
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
{
bHyperLinkSelect[i] = FALSE;
}
InvalidateRect(hwnd, NULL, true);
SendMessage(hwnd, WM_PAINT, GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd);
return 0 ;
case WM_KEYUP:
if (wParam != VK_SPACE)
break ;// fall through
/*case WM_KEYUP:
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;
case WM_KEYDOWN:
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;*/
//case WM_KEYDOWN:
// return 0 ;
case WM_LBUTTONUP :
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
int RenderHyperLink(HWND hwnd,BOOL bSelect)
{
LOGFONT ft;
HFONT hFontNew, hFontOld;
HBRUSH hBrush;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
GetClientRect (hwnd, &rect);
hdc = BeginPaint (hwnd, &ps);
hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)) ;
hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
FillRect(hdc,&rect,hBrush);
memset(&ft, 0, sizeof(ft));
wcscpy(ft.lfFaceName, TEXT("宋体")); //fonttype
ft.lfHeight = 16; //fontsize
ft.lfUnderline = TRUE;
hFontNew = CreateFontIndirect(&ft);
hFontOld = (HFONT)SelectObject(hdc, hFontNew);
if(bSelect)
{
SetBkColor (hdc, GetSysColor (COLOR_WINDOW));
SetTextColor (hdc, (COLORREF)0x000000FF);
}
else
{
SetBkColor (hdc, GetSysColor (COLOR_WINDOW));
SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT));
}
DrawText (hdc, pszText, -1, &rect,
DT_SINGLELINE | DT_LEFT );
//SetWindowLong(hwnd,GWL_STYLE,WS_CAPTION);
SelectObject(hdc, hFontOld);
DeleteObject (SelectObject (hdc, hBrush)) ;
EndPaint (hwnd, &ps) ;
return 0;
}
最后,在RC编辑器里托一个Custom Control到Dialog上,在Class属性里填写CtlHyperLink
- WinCE 开发自定义控件
- winCE 自定义控件开发之groupBox
- WINCE下开发OCX控件
- wince下, c# 自定义的 MessageBox 控件
- Wince下自定义控件文字换行显示
- 用VS2005开发Wince的控件
- 开发Eclipse自定义控件
- 开发Eclipse自定义控件
- Flex开发自定义控件
- 开发自定义绘图控件
- 开发自定义控件
- 开发Web自定义控件
- 自定义控件开发示例
- 自定义GridView控件开发
- 自定义控件的开发
- Delphi自定义控件开发
- 自定义控件开发小记
- 自定义控件开发
- 字符串转整型
- 好久没更新blog了
- IT人生活乐趣
- 爸爸妈妈,我爱你们
- iframe隐藏和显示
- WinCE 开发自定义控件
- 一切归零!
- Ajax光环背后的隐患
- Verilog编码风格 --- 设计考虑
- 谁能帮我吗?谢谢!
- disk boot failure ,insert sysytem disk and press enter解决方法
- Java.lang.NumberFormatException分析
- Verilog编码风格 --- 注释
- 今天要开始写博客了,毕业就要工作了!