OwnerDraw Listview

// test.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "test.h"
#include <windows.h>
#include <commctrl.h>
#include <Winuser.h>

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE   g_hInst;   // 当前实例
HWND    g_hWndMenuBar;  // 菜单栏句柄
HWND    g_hListView;  //ListView句柄

DWORD    QVGA=0;
int     iHeight=36;

// 此代码模块中包含的函数的前向声明:
ATOM   MyRegisterClass(HINSTANCE, LPTSTR);
BOOL   InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
#ifndef WIN32_PLATFORM_WFSP
//INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
LRESULT CreateListView(HWND hWndParent, CREATESTRUCT* lParam);//画主屏幕上的ListView控件
LRESULT OnListViewNotify(HWND hwnd, LPARAM lParam);
void OwnerDraw(LPDRAWITEMSTRUCT lpdis, HDC hdc, HWND hWnd);//在主屏幕上画List控件的item

#endif // !WIN32_PLATFORM_WFSP

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
 MSG msg;

 // 执行应用程序初始化:
 if (!InitInstance(hInstance, nCmdShow))
 {
  return FALSE;
 }

#ifndef WIN32_PLATFORM_WFSP
 HACCEL hAccelTable;
 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST));
#endif // !WIN32_PLATFORM_WFSP

 // 主消息循环:
 while (GetMessage(&msg, NULL, 0, 0))
 {
#ifndef WIN32_PLATFORM_WFSP
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
#endif // !WIN32_PLATFORM_WFSP
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }

 return (int) msg.wParam;
}

//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释:
//
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
 WNDCLASS wc;

 wc.style         = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc   = WndProc;
 wc.cbClsExtra    = 0;
 wc.cbWndExtra    = 0;
 wc.hInstance     = hInstance;
 wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST));
 wc.hCursor       = 0;
 wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
 wc.lpszMenuName  = 0;
 wc.lpszClassName = szWindowClass;

 return RegisterClass(&wc);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;
    TCHAR szTitle[MAX_LOADSTRING];  // 标题栏文本
    TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

    g_hInst = hInstance; // 将实例句柄存储在全局变量中

#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
    // 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化
    // 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。
    SHInitExtraControls();
#endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP

    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_TEST, szWindowClass, MAX_LOADSTRING);

#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
    //如果它已经在运行,则将焦点置于窗口上,然后退出
    hWnd = FindWindow(szWindowClass, szTitle); 
    if (hWnd)
    {
        // 将焦点置于最前面的子窗口
        // “| 0x00000001”用于将所有附属窗口置于前台并
        // 激活这些窗口。
        SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
        return 0;
    }
#endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP

    if (!MyRegisterClass(hInstance, szWindowClass))
    {
     return FALSE;
    }

    hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    if (!hWnd)
    {
        return FALSE;
    }

#ifdef WIN32_PLATFORM_PSPC
    // 使用 CW_USEDEFAULT 创建主窗口时,将不会考虑菜单栏的高度(如果创建了一个
    // 菜单栏)。因此,我们要在创建窗口后调整其大小
    // 如果菜单栏存在
    if (g_hWndMenuBar)
    {
        RECT rc;
        RECT rcMenuBar;

        GetWindowRect(hWnd, &rc);
        GetWindowRect(g_hWndMenuBar, &rcMenuBar);
        rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
  
        MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
    }
#endif // WIN32_PLATFORM_PSPC

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);


    return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND - 处理应用程序菜单
//  WM_PAINT - 绘制主窗口
//  WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 HRESULT lResult;

#if defined(SHELL_AYGSHELL) && !defined(WIN32_PLATFORM_WFSP)
    static SHACTIVATEINFO s_sai;
#endif // SHELL_AYGSHELL && !WIN32_PLATFORM_WFSP
 
    switch (message)
    {
  //监听主窗口上的ListView
  case WM_NOTIFY:
            if(ID_LISTVIEW == wParam)
            {
                lResult = OnListViewNotify(hWnd, lParam);
            }
            break;
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
#ifndef WIN32_PLATFORM_WFSP
                case IDM_HELP_ABOUT:
                    //DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
                    break;
#endif // !WIN32_PLATFORM_WFSP
#ifdef WIN32_PLATFORM_WFSP
                case IDM_OK:
                    DestroyWindow(hWnd);
                    break;
#endif // WIN32_PLATFORM_WFSP
#ifdef WIN32_PLATFORM_PSPC
                case IDM_OK:
                    SendMessage (hWnd, WM_CLOSE, 0, 0);    
                    break;
#endif // WIN32_PLATFORM_PSPC
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_CREATE:
#ifdef SHELL_AYGSHELL
            SHMENUBARINFO mbi;

            memset(&mbi, 0, sizeof(SHMENUBARINFO));
            mbi.cbSize     = sizeof(SHMENUBARINFO);
            mbi.hwndParent = hWnd;
            mbi.nToolBarId = IDR_MENU;
            mbi.hInstRes   = g_hInst;

            if (!SHCreateMenuBar(&mbi))
            {
                g_hWndMenuBar = NULL;
            }
            else
            {
                g_hWndMenuBar = mbi.hwndMB;
            }

   //判断屏幕分辨率,普通=1,VGA=2
   if(GetSystemMetrics(SM_CXSCREEN) > 400)
   {
    QVGA =2;//VGA
   }
   else
   {
    QVGA=1;//普通
   }

   lResult = CreateListView(hWnd, (CREATESTRUCT*)lParam);//创建显示在主屏幕上的Listview
   if(lResult != S_OK)
   {
    CommandBar_Destroy(g_hWndMenuBar);
    PostQuitMessage(0);
   }

#ifndef WIN32_PLATFORM_WFSP
            // 初始化外壳程序激活信息结构
            memset(&s_sai, 0, sizeof (s_sai));
            s_sai.cbSize = sizeof (s_sai);
#endif // !WIN32_PLATFORM_WFSP
#endif // SHELL_AYGSHELL
            break;
  case WM_MEASUREITEM:         
            LPMEASUREITEMSTRUCT lpmi;
            lpmi = (LPMEASUREITEMSTRUCT)lParam;
            if (lpmi->CtlType == ODT_LISTVIEW)
            {
    switch(QVGA)
    {
     case 1:
      iHeight = 36;
      break;
     case 2:
      iHeight = 72;
      break;
    }
            }
   lpmi->itemHeight = iHeight;
            break;
  case WM_DRAWITEM:       //custom drawing code for owner-draw listview control
//-------------------------------------画ListView控件-----------------------------------
            LPDRAWITEMSTRUCT lpdis;
            lpdis = (LPDRAWITEMSTRUCT)lParam;
   OwnerDraw(lpdis, hdc, hWnd);
            break;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
           
            // TODO: 在此添加任意绘图代码...
           
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
#ifdef SHELL_AYGSHELL
            CommandBar_Destroy(g_hWndMenuBar);
#endif // SHELL_AYGSHELL
            PostQuitMessage(0);
            break;

#if defined(SHELL_AYGSHELL) && !defined(WIN32_PLATFORM_WFSP)
        case WM_ACTIVATE:
            // 向外壳程序通知我们的激活消息
            SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
            break;
        case WM_SETTINGCHANGE:
            SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
            break;
#endif // SHELL_AYGSHELL && !WIN32_PLATFORM_WFSP

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

//#ifndef WIN32_PLATFORM_WFSP
“关于”框的消息处理程序。
//INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
//{
//    switch (message)
//    {
//        case WM_INITDIALOG:
//#ifdef SHELL_AYGSHELL
//            {
//                // 创建一个“完成”按钮并调整其大小。
//                SHINITDLGINFO shidi;
//                shidi.dwMask = SHIDIM_FLAGS;
//                shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
//                shidi.hDlg = hDlg;
//                SHInitDialog(&shidi);
//            }
//#endif // SHELL_AYGSHELL
//
//            return (INT_PTR)TRUE;
//
//        case WM_COMMAND:
//#ifdef SHELL_AYGSHELL
//            if (LOWORD(wParam) == IDOK)
//#endif
//            {
//                EndDialog(hDlg, LOWORD(wParam));
//                return (INT_PTR)TRUE;
//            }
//            break;
//
//        case WM_CLOSE:
//            EndDialog(hDlg, message);
//            return (INT_PTR)TRUE;
//
//#ifdef _DEVICE_RESOLUTION_AWARE
//        case WM_SIZE:
//            {
//  DRA::RelayoutDialog(
//   g_hInst,
//   hDlg,
//   DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_ABOUTBOX_WIDE) : MAKEINTRESOURCE(IDD_ABOUTBOX));
//            }
//            break;
//#endif
//    }
//    return (INT_PTR)FALSE;
//}
//#endif // !WIN32_PLATFORM_WFSP

LRESULT CreateListView(HWND hWndParent, CREATESTRUCT* lParam)
{
 RECT rcl;             // rectangle for setting size of window
 int index = 0;     // index used in for loops
 LV_COLUMN lvC;    // list view column structure
 TCHAR szText[MAX_PATH];  // place to store some text
 memset(szText, '/0', sizeof(szText));
 int iWid;
 InitCommonControls();
 
 // Get the size and position of the parent window.
 GetClientRect(hWndParent, &rcl);

 g_hListView = CreateWindow(WC_LISTVIEW, NULL,
    WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_OWNERDATA |LVS_OWNERDRAWFIXED | WS_BORDER,
    rcl.left, rcl.top, rcl.right - rcl.left, rcl.bottom - rcl.top - 23,
    hWndParent, (HMENU)ID_LISTVIEW, g_hInst,NULL);
 
 
 if (g_hListView == NULL )
 {
  goto Error;
 }

 ListView_SetExtendedListViewStyle(g_hListView,
            ListView_GetExtendedListViewStyle(g_hListView) | LVS_EX_FULLROWSELECT);


 switch(QVGA)
 {
  case 1:
   iWid = rcl.right - rcl.left - 14;
   break;
  case 2:
   iWid = rcl.right - rcl.left - 28;
   break;
 }
 
 lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM;
 lvC.fmt = LVCFMT_LEFT;  // left-align column
  
 // Add the columns.
 lvC.iSubItem = 1;
 lvC.cx = iWid;
 if (ListView_InsertColumn(g_hListView, index, &lvC) == -1)
 {
  goto Error;
 }
 ListView_SetItemCount(g_hListView, 20);
 return(0);
Error:
    return(-1);
}

//程序主窗口上的选种功能
LRESULT OnListViewNotify(
    HWND hwnd,
    LPARAM lParam
    )
{
    NMHDR* pnmh = (NMHDR*) lParam;
    LRESULT lResult = 0;

    switch(pnmh->code)
    {
        case LVN_ITEMACTIVATE:
            {
    NMLISTVIEW* pnmlv = (NMLISTVIEW*)lParam;
    int iItem = pnmlv->iItem;
    MessageBox(hwnd, TEXT("You click the item"), TEXT("Note"), MB_OK);
            }
            break;
    }
    return(lResult);
}

//画主屏幕上的ListView控件的每一个item项
void OwnerDraw(LPDRAWITEMSTRUCT lpdis, HDC hdc, HWND hWnd)
{
 //获得屏幕宽度
 RECT rect;
 GetClientRect(hWnd, &rect);
 lpdis->rcItem.left = rect.left;
 lpdis->rcItem.right = rect.right;

 TCHAR tOrder[5];

 int iTaskIndex;
 
 if (lpdis->CtlType == ODT_LISTVIEW)
    {
  LPCTSTR lpszText = (LPCTSTR) lpdis->itemData;

  hdc = lpdis->hDC;
  // If this item is selected, set the background color
  // and the text color to appropriate values. Also, erase
  // rect by filling it with the background color.
  HBRUSH hbrBkColor = CreateSolidBrush (RGB(255,255,255));
  HBRUSH hbrSEL = CreateSolidBrush (RGB(155,197,255));

  if ((lpdis->itemAction | ODA_SELECT) && (lpdis->itemState & ODS_SELECTED))
  {
     SetTextColor(hdc, RGB(0,0,0));
     FillRect(hdc, &lpdis->rcItem,hbrSEL);
  }
  else
  {
     SetTextColor(hdc, RGB(0,0,0));
     FillRect(hdc, &lpdis->rcItem,hbrBkColor);
  }

  DeleteObject (hbrSEL);
  DeleteObject (hbrBkColor);

  设置字体大小
  //HFONT hfont;
  //HFONT holdfont;
  //LOGFONT logfont;

  int iWid;
  switch(QVGA)
  {
   case 1:
    iWid = rect.right - rect.left - 14;
    break;
   case 2:
    iWid = rect.right - rect.left - 28;
    break;
  }
  //logfont.lfWidth=0;
  //logfont.lfEscapement=0;
  //logfont.lfOrientation=0;
  logfont.lfWeight=400;
  //logfont.lfItalic=false;
  //logfont.lfUnderline=false;
  //logfont.lfStrikeOut=false;
  //logfont.lfCharSet=DEFAULT_CHARSET;
  //logfont.lfOutPrecision=OUT_DEFAULT_PRECIS;
  //logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
  //logfont.lfQuality=DEFAULT_QUALITY;
  //logfont.lfPitchAndFamily=FF_DECORATIVE;
  //logfont.lfFaceName;

  //------------------------------------------------------------------------------//
  //获得item索引
  iTaskIndex = lpdis->itemID;
  /*logfont.lfWeight=400;
  hfont=CreateFontIndirect(&logfont);
  holdfont=(HFONT)SelectObject(hdc,hfont);*/
  //wsprintf(tOrder, TEXT("%d"),(iTaskIndex+1));
  //lpdis->rcItem.left =0;
  //lpdis->rcItem.right =iWid/9;
  //DrawText(hdc, tOrder, lstrlen(tOrder),&lpdis->rcItem, DT_CENTER|DT_SINGLELINE|DT_BOTTOM);
  //SelectObject(hdc,holdfont);

  //------------------------------------------------------------------------------//
  //Name
  //画任务开始时间矩形
  lpdis->rcItem.left =0;
  lpdis->rcItem.right = iWid;
  //lpdis->rcItem.top =iTaskIndex*iHeight;
  lpdis->rcItem.bottom = lpdis->rcItem.top + iHeight/2;
  /*logfont.lfWeight=400;
  hfont=CreateFontIndirect(&logfont);
  holdfont=(HFONT)SelectObject(hdc,hfont);*/
  TCHAR tName[20];
  memset(tName, '/0', 20);
  lstrcpy(tName, TEXT("幸涌沛"));
  int a=10;
  a =DrawText(hdc, tName, lstrlen(tName),&lpdis->rcItem, DT_LEFT|DT_SINGLELINE|DT_BOTTOM);
  //SelectObject(hdc,holdfont);

  //------------------------------------------------------------------------------//
  //Phone Number
  lpdis->rcItem.left = 0;
  lpdis->rcItem.right = iWid;
  lpdis->rcItem.top =lpdis->rcItem.top + iHeight/2;
  lpdis->rcItem.bottom = lpdis->rcItem.top + iHeight;
  /*logfont.lfWeight=400;
  hfont=CreateFontIndirect(&logfont);
  holdfont=(HFONT)SelectObject(hdc,hfont);*/
  TCHAR tNumber[20];
  memset(tNumber, '/0', 20);
  lstrcpy(tNumber, TEXT("15884557066"));
  DrawText(hdc, tNumber, lstrlen(tNumber), &lpdis->rcItem, DT_LEFT|DT_SINGLELINE|DT_TOP);
  //SelectObject(hdc,holdfont);

  //DeleteObject(hfont);
  //DeleteObject(holdfont);

  //DeleteObject(dayBit);
  //DeleteObject(olddayBit);
  //DeleteDC(dayMemDC);
  
        ReleaseDC (g_hListView, hdc);
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值