电子商城网站开发项目描述二学一做网站
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:23
当前位置: 首页 > news >正文
电子商城网站开发项目描述,二学一做网站,免费招聘网站推荐,工作证明带公章电子版场景
开发WTL/Win32的程序时#xff0c;经常会用到表格控件CListViewCtrl。这个控件需要设置列的宽度#xff0c;当用完100%的宽度来平均分配给列宽时#xff0c;一加载数据多#xff0c;就会出现垂直滚动条后#xff0c;水平滚动条也会同时出现的问题。怎么设置才能让水…场景
开发WTL/Win32的程序时经常会用到表格控件CListViewCtrl。这个控件需要设置列的宽度当用完100%的宽度来平均分配给列宽时一加载数据多就会出现垂直滚动条后水平滚动条也会同时出现的问题。怎么设置才能让水平滚动条不出现?
图1
说明 WTL的控件CListViewCtrl实际上就是Win32的listview控件的封装。当行个数超过它的可见区域时就会默认出现垂直滚动条。这个垂直滚动条也是占用了原本ListView的客户端区域导致ListView的客户端区域宽度减少也就是现在的客户端宽度 原来的客户端区域宽度-滑块的宽度。 当然也可以在行数据超过可见区域时重新计算列宽度只是这种做法需要在合适的时候进行判断行数据是否够多导致垂直滚动条出现。一般不建议做这个冗余的判断处理。 目前推荐的做法是布局ListView时也就是设置它的列宽时如果没有出现垂直滚动条那么预留滚动条的宽度不分配给列宽。 以下是获取滑块宽度的做法: 关于WTL/Win32开发请参考我的课程 使用WTL进行Windows桌面应用开发
void CView::layoutListView()
{CRect rect;listview.GetClientRect(rect);auto width rect.Width();listview.SetColumnWidth(0, width*0.2);listview.SetColumnWidth(1, width*0.3);listview.SetColumnWidth(2, width*0.2);auto last width * 0.3;if (buttonIsLayoutWithThumb.GetCheck()) {auto thumbWidth GetWindowVScrollBarThumbWidth(listview, false);// 如果默认没有滚动条减去滑块宽度。if (!thumbWidth) { thumbWidth GetWindowVScrollBarThumbWidth(listview, true);last last - thumbWidth;}}listview.SetColumnWidth(3, last);
}例子
View.h
// View.h : interface of the CView class
//
/#pragma once#include utility
#include string
#include vector
#include memory
#include atlmisc.h
#include atlctrls.h
#include atlctrlx.h
#include GdiPlus.husing namespace std;enum
{kMyButtonId WM_USER1,kMyButtonId2,kMyButtonId3,kMyButtonId4,kMyListViewId
};class Photo
{
public:wstring name;wstring createDate;wstring path;wstring format;
};class CView : public CWindowImplCView
{
public:DECLARE_WND_CLASS(NULL)BOOL PreTranslateMessage(MSG* pMsg);BEGIN_MSG_MAP_EX(CView)MSG_WM_CREATE(OnCreate)MSG_WM_SIZE(OnSize)MESSAGE_HANDLER(WM_PAINT, OnPaint)NOTIFY_HANDLER(kMyListViewId,NM_CLICK,OnNMClickListResult)NOTIFY_HANDLER(kMyListViewId,LVN_GETDISPINFO,OnGetListViewData)NOTIFY_HANDLER(kMyListViewId,LVN_ODCACHEHINT,OnPrepareListViewData)NOTIFY_HANDLER(kMyListViewId,LVN_ODFINDITEM,OnFindListViewData)COMMAND_RANGE_HANDLER_EX(kMyButtonId,kMyButtonId4,OnCommandIDHandlerEX)REFLECT_NOTIFICATIONS()END_MSG_MAP()protected:
// Handler prototypes (uncomment arguments if needed):
// LRESULT MessageHandler(UINT /uMsg/, WPARAM /wParam/, LPARAM /lParam/, BOOL /bHandled/)
// LRESULT CommandHandler(WORD /wNotifyCode/, WORD /wID/, HWND /hWndCtl/, BOOL /bHandled/)
// LRESULT NotifyHandler(int /idCtrl/, LPNMHDR /pnmh/, BOOL /bHandled/)int OnCreate(LPCREATESTRUCT lpCreateStruct);LRESULT OnPaint(UINT /uMsg/, WPARAM /wParam/, LPARAM /lParam/, BOOL /bHandled/);void UpdateLayout();LRESULT OnNMClickListResult(int idCtrl,LPNMHDR pnmh,BOOL bHandled);LRESULT OnGetListViewData(int idCtrl,LPNMHDR pnmh,BOOL bHandled);LRESULT OnPrepareListViewData(int idCtrl,LPNMHDR pnmh,BOOL bHandled);LRESULT OnFindListViewData(int idCtrl,LPNMHDR pnmh,BOOL bHandled);void OnCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl);void OnSize(UINT nType, CSize size);void ReloadMockData(int count);void ReloadListView();protected:void layoutListView();static int GetWindowVScrollBarThumbWidth(HWND hwnd, bool bAutoShow);private:std::wstring GetControlText(HWND hwnd,wchart* buf NULL);CListViewCtrl listview;vectorsharedptrPhoto photos;CFont fontnormal;CFont fontbold;CBrushHandle brushwhite;CBrushHandle brushhollow;CBrush brushred;CButton buttonIsLayoutWithThumb;CButton buttonReloadMockData;CButton buttonReloadMockData10;CButton buttonReloadListView;
};
View.cpp
// View.cpp : implementation of the CView class
//
/#include stdafx.h
#include resource.h
#include utility
#include sstream
#include stdint.h
#include assert.h
#include Strsafe.h#include View.h
#include CommCtrl.h
#include string
#include regexusing namespace std;BOOL CView::PreTranslateMessage(MSG* pMsg)
{return FALSE;
}LRESULT CView::OnPaint(UINT /uMsg/, WPARAM /wParam/, LPARAM /lParam/, BOOL /bHandled/)
{CPaintDC dc(m_hWnd);CMemoryDC mdc(dc,dc.m_ps.rcPaint);CRect rect_client;GetClientRect(rect_client);mdc.FillSolidRect(rect_client,RGB(255,255,255));//TODO: Add your drawing code herereturn 0;
}static HFONT GetFont(int pixel,bool bold,const wchar_t* font_name)
{LOGFONT lf; memset(lf, 0, sizeof(LOGFONT)); // zero out structure lf.lfHeight pixel; // request a 8-pixel-height fontif(bold){lf.lfWeight FW_BOLD; }lstrcpy(lf.lfFaceName, font_name); // request a face name ArialHFONT font ::CreateFontIndirect(lf);return font;
}std::wstring CView::GetControlText(HWND hwnd,wchar_t* buf)
{auto length ::GetWindowTextLength(hwnd);bool bufNull false;if(!buf){buf new wchar_tlength1;bufNull true;}::GetWindowText(hwnd,buf,length1);std::wstring str(buf);if(bufNull)delete []buf;return str;
}static std::wstring GetProductBinDir()
{static wchar_t szbuf[MAX_PATH]; GetModuleFileName(NULL,szbuf,MAXPATH); PathRemoveFileSpec(szbuf);int length lstrlen(szbuf);szbuf[length] L\;szbuf[length1] 0;return std::wstring(szbuf);
}LRESULT CView::OnGetListViewData(int idCtrl,LPNMHDR pnmh,BOOL bHandled)
{NMLVDISPINFO* plvdi (NMLVDISPINFO*) pnmh;auto iItem plvdi-item.iItem;if (-1 iItem)return 0;auto count photos.size();if(!count || count iItem)return 0;auto photo photos_[iItem];if(plvdi-item.mask LVIF_TEXT){switch(plvdi-item.iSubItem){case 0:StringCchCopy(plvdi-item.pszText, plvdi-item.cchTextMax, to_wstring((int64_t)iItem1).c_str());break;case 1:StringCchCopy(plvdi-item.pszText, plvdi-item.cchTextMax, photo-name.c_str());break;case 2:StringCchCopy(plvdi-item.pszText, plvdi-item.cchTextMax, photo-format.c_str());break;case 3:StringCchCopy(plvdi-item.pszText, plvdi-item.cchTextMax, photo-createDate.cstr());break;}}return 0;
}LRESULT CView::OnPrepareListViewData(int idCtrl,LPNMHDR pnmh,BOOL bHandled)
{return 0;
}LRESULT CView::OnFindListViewData(int idCtrl,LPNMHDR pnmh,BOOL bHandled)
{LPNMLVFINDITEM pnmfi (LPNMLVFINDITEM)pnmh;auto iItem pnmfi-iStart;if (-1 iItem)return -1;auto count photos.size();if(!count || count iItem)return -1;return 0;
}LRESULT CView::OnNMClickListResult(int idCtrl,LPNMHDR pnmh,BOOL bHandled)
{return 0;
}void CView::OnCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)
{switch(nID){case kMyButtonId3:{buttonIsLayoutWithThumb.SetCheck(!buttonIsLayoutWithThumb.GetCheck());ReloadListView();layoutListView();break;}case kMyButtonId:{ReloadMockData(10000);break;}case kMyButtonId4:{ReloadMockData(10);break;}case kMyButtonId2:{ReloadListView();break;}}
}void CView::ReloadListView()
{listview.SetItemCount(0);photos.clear();
}void CView::ReloadMockData(int count)
{wchar_t buf[MAX_PATH] {0};LVCOLUMN co;memset(co,0,sizeof(co));co.mask LVCF_TEXT;co.pszText buf;co.cchTextMax MAXPATH;listview.GetColumn(1,co);std::wstring c0Text(buf);listview.GetColumn(2,co);std::wstring c1Text(buf);listview.GetColumn(3,co);std::wstring c2Text(buf);static int index 0;for(int i 0; i count;i,index){auto photo new Photo();wsprintf(buf,(c0TextL-%d).c_str(),index);photo-name buf;wsprintf(buf,(c1TextL-%d).c_str(),index);photo-format buf;wsprintf(buf,(c2TextL-%d).cstr(),index);photo-createDate buf;photos.push_back(move(sharedptrPhoto(photo)));}listview.SetItemCount(photos_.size());
}int CView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{fontnormal ::GetFont(16,false,LArial);fontbold ::GetFont(16,true,LArial);brushhollow AtlGetStockBrush(HOLLOW_BRUSH);brushwhite AtlGetStockBrush(WHITE_BRUSH);brushred.CreateSolidBrush(RGB(255,0,0));// 1.创建CListViewCtrllistview_.Create(m_hWnd,0,NULL,WS_CHILD | WS_TABSTOP |WS_VISIBLE|LVS_ALIGNLEFT|LVS_REPORT|LVS_SHOWSELALWAYS|WS_BORDER|LVSOWNERDATA,0,kMyListViewId);listview.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EXDOUBLEBUFFER);listview.SetFont(fontnormal);auto header listview_.GetHeader();header.SetFont(fontbold);listview.SetBkColor(RGB(255,255,255));listview.InsertColumn(0,LNo.,LVCFMTLEFT,0);listview.InsertColumn(1,LName,LVCFMTLEFT,0);listview.InsertColumn(2,LFormat,LVCFMTLEFT,0);listview.InsertColumn(3,LCreate Date,LVCFMTLEFT,0);// 2.创建按钮buttonIsLayoutWithThumb.Create(m_hWnd, 0, L布局列宽是否计算滑块宽度, WS_CHILD | WS_VISIBLE | BSCHECKBOX, 0, kMyButtonId3);buttonIsLayoutWithThumb.SetFont(fontnormal);buttonReloadMockData_.Create(m_hWnd,0,L加载新数据10000条,WS_CHILD|WSVISIBLE,0,kMyButtonId);buttonReloadMockData.SetFont(fontnormal);buttonReloadMockData10_.Create(m_hWnd, 0, L加载新数据10条, WS_CHILD | WSVISIBLE, 0, kMyButtonId4);buttonReloadMockData10.SetFont(fontnormal);buttonReloadListView_.Create(m_hWnd,0,L清空表格,WS_CHILD|WSVISIBLE,0,kMyButtonId2);buttonReloadListView.SetFont(fontnormal);return 0;
}int CView::GetWindowVScrollBarThumbWidth(HWND hwnd, bool bAutoShow)
{SCROLLBARINFO sb { 0 };sb.cbSize sizeof(SCROLLBARINFO);GetScrollBarInfo(hwnd, OBJID_VSCROLL, sb);if (!bAutoShow)return sb.dxyLineButton;if (sb.dxyLineButton)return sb.dxyLineButton;::ShowScrollBar(hwnd, SB_VERT, TRUE);sb.cbSize sizeof(SCROLLBARINFO);GetScrollBarInfo(hwnd, OBJID_VSCROLL, sb);::ShowScrollBar(hwnd, SBVERT, FALSE);return sb.dxyLineButton;
}void CView::layoutListView()
{CRect rect;listview.GetClientRect(rect);auto width rect.Width();listview.SetColumnWidth(0, width*0.2);listview.SetColumnWidth(1, width*0.3);listview.SetColumnWidth(2, width*0.2);auto last width * 0.3;if (buttonIsLayoutWithThumb.GetCheck()) {auto thumbWidth GetWindowVScrollBarThumbWidth(listview, false);if (!thumbWidth) {// 如果默认没有滚动条thumbWidth GetWindowVScrollBarThumbWidth(listview, true);last last - thumbWidth;}}listview_.SetColumnWidth(3, last);
}void CView::OnSize(UINT nType, CSize size)
{if (!size.cx)return;UpdateLayout();
}void CView::UpdateLayout()
{CRect rect;GetClientRect(rect);CClientDC dc(m_hWnd);dc.SelectFont(fontnormal);CSize sizeCheck;buttonIsLayoutWithThumb.GetIdealSize(sizeCheck);buttonIsLayoutWithThumb.MoveWindow(CRect(20,2, sizeCheck.cx20, sizeCheck.cy2));CSize size_control(rect.Width() - 50,300);CRect rect_control CRect(CPoint(20,20),sizecontrol);listview.MoveWindow(rect_control);layoutListView();CSize sizebutton;buttonReloadMockData.GetIdealSize(size_button);rect_control CRect(CPoint(rect_control.left,rect_control.bottom10),sizebutton);buttonReloadMockData.MoveWindow(rect_control);CSize sizebutton4;buttonReloadMockData10.GetIdealSize(size_button4);rect_control CRect(CPoint(rect_control.right10, rect_control.top), sizebutton);buttonReloadMockData10.MoveWindow(rectcontrol);CSize sizeButton2;buttonReloadListView.GetIdealSize(sizeButton2);rect_control CRect(CPoint(rect_control.right10,rectcontrol.top),sizeButton2);buttonReloadListView.MoveWindow(rect_control);}图2 图3
项目下载地址
https://download.csdn.net/download/infoworld/89036594
参考 GetScrollBarInfo 函数 (winuser.h) - Win32 apps | Microsoft Learn SCROLLBARINFO (winuser.h) - Win32 apps | Microsoft Learn ShowScrollBar 函数 (winuser.h) - Win32 apps | Microsoft Learn
- 上一篇: 电子产品玩具东莞网站建设虹口房产网站建设
- 下一篇: 电子商城网站如何建设网站建设待遇怎样
相关文章
-
电子产品玩具东莞网站建设虹口房产网站建设
电子产品玩具东莞网站建设虹口房产网站建设
- 技术栈
- 2026年03月21日
-
电子产品去什么网站做站点怎么做下载类网站
电子产品去什么网站做站点怎么做下载类网站
- 技术栈
- 2026年03月21日
-
电影资源网站建设公司的网站开发服务费怎么入账
电影资源网站建设公司的网站开发服务费怎么入账
- 技术栈
- 2026年03月21日
-
电子商城网站如何建设网站建设待遇怎样
电子商城网站如何建设网站建设待遇怎样
- 技术栈
- 2026年03月21日
-
电子商城网站如何建设在线网站建设哪家便宜
电子商城网站如何建设在线网站建设哪家便宜
- 技术栈
- 2026年03月21日
-
电子商务毕业设计网站如何实现网站开发
电子商务毕业设计网站如何实现网站开发
- 技术栈
- 2026年03月21日






