基本上我在自定義窗口中有一個滾動條,我們可以添加按鈕,文本框等等的其他控件,現在這裏是我創建的滾動條的問題,好吧它滾動但問題是最大的滾動應該被指定,然後阻止它滾動更多,但可以有儘可能多的控制作爲用戶想要的,這對我來說它不會被知道,我的意思是喜歡當您使用WM_VSCROLL或HSCROLL指定它時,將問題說成更像是一個文本框的內置滾動條,然後讓用戶能夠像在文本框中鍵入一樣滾動,這正是我想要的。 這裏是代碼到目前爲止我已經能夠經歷: -如何在vC++中製作可滾動窗口win32
代碼滾動條: -
case WM_LBUTTONDOWN:
{
SCROLLINFO si = { 0 };
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_POS;
si.nPos = 0;
si.nTrackPos = 0;
GetScrollInfo(hwnd, SB_VERT, &si);
break;
}
case WM_VSCROLL:
{
auto action = LOWORD(wParam);
HWND hScroll = (HWND)lParam;
int pos = -1;
if (action == SB_THUMBPOSITION || action == SB_THUMBTRACK) {
pos = HIWORD(wParam);
} else if (action == SB_LINEDOWN) {
pos = g_scrollY + 50;
} else if (action == SB_LINEUP) {
pos = g_scrollY - 50;
} else if (action == SB_PAGEUP) {
GetClientRect(hwnd, &r);
pos = g_scrollY - r.bottom;
} else if (action == SB_PAGEDOWN){
GetClientRect(hwnd, &r);
pos = g_scrollY + r.bottom;
}
if (pos == -1)
break;
SCROLLINFO si = { 0 };
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_POS;
si.nPos = pos;
si.nTrackPos = 0;
SetScrollInfo(hwnd, SB_VERT, &si, true);
GetScrollInfo(hwnd, SB_VERT, &si);
pos = si.nPos;
POINT pt;
pt.x = 0;
pt.y = pos - g_scrollY;
auto hdc = GetDC(hwnd);
LPtoDP(hdc, &pt, 1);
ReleaseDC(hwnd, hdc);
ScrollWindow(hwnd, 0, -pt.y, NULL, NULL);
g_scrollY = pos;
return 0;
}
case WM_SIZE:
{
RECT rc = { 0 };
GetClientRect(hwnd, &rc);
SCROLLINFO si = { 0 };
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = MAX_RANGE;
if(si.nPos > 100)
si.nMax = 5000;
if(SB_THUMBPOSITION == 100){
si.nMax = MAX_RANGE;}
si.nPage = (rc.bottom - rc.top);
si.nPos = 0;
si.nTrackPos = 0;
SetScrollInfo(hwnd, SB_VERT, &si, true);
break;
}
,你可以看到si.nMax價值是要行的最高金額能夠滾動,但我希望它和控件一樣多。
您可能要考慮使用像wxWidgets,Qt等GUI框架。 –
@ThomasMatthews:wxWidgets可能幾乎不可用。另一方面,Qt太破碎了,你不可能想要推薦它。即使MFC生產出更好的圖形用戶界面,這也說了很多。除此之外,問題是關於Windows API編程,而可滾動窗口當然不是尋找框架的理由。 – IInspectable
如果要求提供框架建議是SO的話題,那麼建議他們也應該如此。 –