里面涉及到很多知识

包括3D样式的去除,重绘ListView控件,以及处理控件的边框颜色

// Test_listview_1.cpp : Defines the entry point for the application.
// #include "stdafx.h"
#include "Test_listview_1.h"
#include <commctrl.h>
#include <uxtheme.h> #pragma comment (lib,"Comctl32.lib")
#pragma comment (lib,"UxTheme.lib")
//#pragma comment(linker,"\"/manifestdependency:type='win32' \
//name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
//processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#define MAX_LOADSTRING 100 // Global Variables:
HINSTANCE hInst; // current instance
WCHAR szTitle[MAX_LOADSTRING]; // The title bar text
WCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
HWND hwndList1;
int middle = , middleH = , width = , height = ;
BOOL S_1 = FALSE;
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ListProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, UINT_PTR, DWORD_PTR);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Place code here. // Initialize global strings
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_TESTLISTVIEW1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTLISTVIEW1)); MSG msg; // Main message loop:
while (GetMessage(&msg, nullptr, , ))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return (int) msg.wParam;
} //
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = ;
wcex.cbWndExtra = ;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTLISTVIEW1));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_TESTLISTVIEW1);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex);
} //
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, , CW_USEDEFAULT, , nullptr, nullptr, hInstance, nullptr); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
} //
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
INITCOMMONCONTROLSEX icex; // Structure for control initialization.
icex.dwICC = ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&icex); hwndList1 = CreateWindow(WC_LISTVIEW, L"", WS_VISIBLE | WS_CHILD | LVS_REPORT | WS_BORDER | WS_VSCROLL | LVS_OWNERDRAWFIXED , , , width, height, hWnd, NULL, GetModuleHandle(NULL), );
DWORD Style = GetWindowLong(hwndList1, GWL_STYLE);
SetWindowLong(hwndList1, GWL_STYLE, Style &~WS_BORDER);
SetWindowSubclass(hwndList1, &ListProc, , NULL);
// HWND hHeader = ListView_GetHeader(hwndList1);
// SetWindowTheme(hHeader, L"", L"");
LVCOLUMN column;
column.mask = LVCF_WIDTH | LVCF_TEXT;
column.cx = ;
column.pszText = (LPWSTR)L"MASTER";
ListView_InsertColumn(hwndList1, , &column); //column for sub item 0 LVITEM lvi = {};
lvi.iItem = ListView_GetItemCount(hwndList1);
lvi.mask = LVIF_TEXT | LVIF_STATE;
lvi.pszText = (LPWSTR)L"MASTER1";
lvi.iSubItem = ;
ListView_InsertItem(hwndList1, &lvi);
lvi.pszText = (LPWSTR)L"MASTER2";
ListView_InsertItem(hwndList1, &lvi);
lvi.pszText = (LPWSTR)L"MASTER3";
ListView_InsertItem(hwndList1, &lvi);
lvi.pszText = (LPWSTR)L"MASTER4";
ListView_InsertItem(hwndList1, &lvi);
lvi.pszText = (LPWSTR)L"MASTER5";
ListView_InsertItem(hwndList1, &lvi);
lvi.pszText = (LPWSTR)L"MASTER6";
ListView_InsertItem(hwndList1, &lvi);
lvi.pszText = (LPWSTR)L"MASTER7";
ListView_InsertItem(hwndList1, &lvi);
}
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_SIZE:
if (wParam == SIZE_RESTORED) {
SetWindowPos(hwndList1, , , , , , );
}
else if (wParam == SIZE_MAXIMIZED) {
SetWindowPos(hwndList1, , middle - ( + width), middleH - ( + height), width, height, );
RECT rc;
GetClientRect(hwndList1, &rc);
ListView_SetColumnWidth(hwndList1, , rc.right - rc.left);//rc.left is zero
}
break;
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
HDC hDC = pDIS->hDC;
RECT rc = pDIS->rcItem;
HFONT hF;
HBRUSH bg = (HBRUSH)(::GetStockObject(DC_BRUSH));
HPEN pn = (HPEN)(::GetStockObject(NULL_PEN));
::SelectObject(hDC, bg);
::SelectObject(hDC, pn);
::SetTextColor(hDC, RGB(, , ));
int points = ;
// if (resX <= 800)
// {
hF = CreateFont(, , , , FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Tahoma");
// }
// else
// {
// points = 10;
// int fontheight = -MulDiv(points, GetDeviceCaps(hDC, LOGPIXELSY), 72);
// hF = CreateFont(fontheight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Tahoma");
// } HFONT hOldFont = (HFONT)SelectObject(hDC, hF);
if ((pDIS->itemID % ) != )
::SetDCBrushColor(hDC, RGB(, , ));
else {
::SetDCBrushColor(hDC, RGB(, , )); }
::Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); wchar_t buffer[] = { };
ListView_GetItemText(pDIS->hwndItem, pDIS->itemID, , (LPWSTR)buffer, ); rc.left = ; ::DrawText(hDC, (LPWSTR)buffer, -, &rc, DT_SINGLELINE | DT_VCENTER);
SelectObject(hDC, hOldFont);
DeleteObject(hF); }
break;
case WM_MEASUREITEM:
{
MEASUREITEMSTRUCT * m = (MEASUREITEMSTRUCT*)lParam;
m->itemHeight = ;
}
break; //case WM_NOTIFY:
// if (((LPNMHDR)lParam)->code == NM_CUSTOMDRAW)
// {
// LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
// switch (lplvcd->nmcd.dwDrawStage)
// {
// case CDDS_PREPAINT:
// return CDRF_NOTIFYITEMDRAW; // case CDDS_ITEMPREPAINT:
// if (((int)lplvcd->nmcd.dwItemSpec % 2) == 0) {
// lplvcd->clrText = RGB(0, 0, 0);
// // lplvcd->clrTextBk = RGB(255, 255, 255);
// lplvcd->clrTextBk = RGB(193, 228, 255);
// }
// else {
// lplvcd->clrText = RGB(0, 0, 0);
// lplvcd->clrTextBk = RGB(202, 233, 255);
// } // return CDRF_NEWFONT;
// }
// return TRUE;
// }
//
case WM_PAINT:
{
PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps);
RECT rc,clrc;
GetWindowRect(hwndList1, &rc);
ScreenToClient(hWnd, (LPPOINT)&rc.left);
ScreenToClient(hWnd, (LPPOINT)&rc.right);
auto hpen = CreatePen(PS_SOLID, , RGB(, , ));
auto oldpen = SelectObject(hdc, hpen);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
if (S_1)
{
Rectangle(hdc, rc.left - , rc.top - , rc.right + , rc.bottom + );
}
else
{
Rectangle(hdc, , , , );
}
SelectObject(hdc, oldpen);
DeleteObject(oldpen);
ReleaseDC(hwndList1, hdc);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break; case WM_DESTROY:
PostQuitMessage();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return ;
} // Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
} LRESULT CALLBACK ListProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, UINT_PTR, DWORD_PTR) {
switch (msg)
{
case WM_NOTIFY:
if (((LPNMHDR)lp)->code == NM_CUSTOMDRAW)
{
LPNMCUSTOMDRAW lpcd = (LPNMCUSTOMDRAW)lp;
switch (lpcd->dwDrawStage)
{
case CDDS_PREPAINT: return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT:
{ SetBkColor(lpcd->hdc, RGB(, , ));
// SetBkColor(lpcd->hdc, RGB(255, 0, 0));
SetTextColor(lpcd->hdc, RGB(, , ));
return CDRF_NEWFONT;
} }
} break; case WM_NCPAINT:
{
RECT rc;
GetWindowRect(hwnd, &rc);
OffsetRect(&rc, -rc.left, -rc.top);
auto hdc = GetWindowDC(hwnd);
auto hpen = CreatePen(PS_SOLID, , RGB(, , ));
auto oldpen = SelectObject(hdc, hpen);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
// Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
SelectObject(hdc, oldpen);
DeleteObject(oldpen);
ReleaseDC(hwnd, hdc);
S_1 = TRUE;
// return 0;
break;
} case WM_NCDESTROY:
RemoveWindowSubclass(hwnd, ListProc, );
break;
} return DefSubclassProc(hwnd, msg, wp, lp);
} //InvalidateRect(hwnd, &rc, TRUE);

里面有很多注释的代码,我没删除是因为它们是有意义的

当创建ListView控件的时候,添加自定义的样式LVS_OWNERDRAWFIXED之后, 主窗口的WM_DRAWITEM起作用,WM_NOTIFY失效; 控件的自定义的窗口处理里的WM_NOTIFY依然有效。

最新文章

  1. Android BLE 蓝牙低功耗教程,中央BluetoothGatt和周边BluetoothGattServer的实现
  2. [Spring MVC] - Spring MVC环境搭建
  3. linux系统tomcat启动正常访问不到主页面
  4. NOJ1103-全排列
  5. [Qt5] 减少dll依赖和大小(特别是webkit的大小和依赖)
  6. 异步加载DOM造成的高度问题造成iScroll不能滚动
  7. 一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频
  8. 什么是工程师文化?各位工程师是为什么活的?作为一个IT或互联网公司为什么要工程师文化?
  9. Android-兼容问题
  10. android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
  11. ubuntu ???????????? no permissions 问题解决
  12. opnet安装及安装中出现问题的解决办法 分类: opnet 2014-04-06 21:50 397人阅读 评论(0) 收藏
  13. php的扩展配置
  14. html网页练习豆瓣网
  15. MyBatis——模糊查询
  16. Python 编程快速上手 第七章总结
  17. Ring3创建事件Ring0设置事件
  18. iptables禁止别人,允许自己
  19. artTemplate
  20. jquery ui autocomplete 模拟百度搜索自动提示

热门文章

  1. nohup及pip命令总结
  2. flutter runtimeType
  3. 【DVWA】Brute Force(暴力破解)通关教程
  4. Java学习之==&gt;面向对象编程 Part1
  5. django 数据库操作详解
  6. k8s、CI/CD、pipline介绍
  7. 【VS开发】设置文档标题
  8. 【VS开发】【图像处理】V4L2 pixel format
  9. 解决reportNG中文乱码(转:http://www.it610.com/article/3626590.htm)
  10. k8s-kubernettes-sercet存储