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) ;


}

然后处理控件的各种消息达到自己想要的效果

 

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, 0sizeof(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

原创粉丝点击