我正在使用C++和winapi創建一個GUI。我已經能夠制定出很多細節,但是在另一個面板中滾動面板時遇到了一些麻煩。我知道如何在c#中做到這一點,但與c + +我被擊敗。嵌套面板不按預期滾動。爲什麼不?
我已創建的類,其生成面板一個通用的「主題」,我可以指定主題(例如,「主題A」)的名稱。我創建了一個獨立的類,它生成一個包含所有這些主題的面板。這是TopicHolder。所以我傳入一個名稱爲字符串的向量。然後我生成新的Topic對象,每個對象都有自己的GUI控件。然後,我更新TopicHolder的佈局,包括所有主題,根據他們的標準大小爲他們提供x和y位置。
一切看起來或多或少像我最初想要的。如果這是c#,則主題持有者將滾動,並且各個主題將根據可見的較大面板的確切部分滾動進入和看不見。但是,在這種情況下,滾動不起作用。這是我第一次使用C++ gui進行滾動,所以我可能會錯過一些東西。
以下是一些關鍵代碼段。我會歡迎任何有用的提示。 感謝
添加主題
void TopicHolder::SetTopics(std::vector<std::string> t)
{
for(unsigned i=0;i<t.size();i++)
{
//I give the topic the HWND of the TopicHolder so it can
//be properly parented on that GUI element
Topic* tmp = new Topic(myHWND, t[i]);
vectorOfTopics.push_back(tmp);
}
UpdateLayout(holderRect);
}
在主題相對佈局的主題來處理TopicHolder
void TopicHolder::UpdateLayout(RECT r)
{
int buffer = 5;//buffer between elements
int x = buffer;
int y = buffer;
for(unsigned i=0;i<vectorOfTopics.size();i++)
{
RECT tmp;
tmp.left=x;
tmp.top=y;
tmp.right = r.right-(2*buffer);
tmp.bottom = y+Topic::HEIGHT;//standard height per topic
vectorOfTopics[i].Layout(tmp);
y+= Topic::HEIGHT+buffer;
}
}
佈局對象
void Topic::Layout(RECT r)
{
SetWindowPos(myHWND, //this is the HWND of the topic
HWND_TOP, r.left, r.top, Topic::WIDTH, Topic::HEIGHT, SWP_SHOWWINDOW);
}
---------- - - - - -編輯 - - - - - - - - - - - - - - - - - - - - -
Grr ...好吧,所以C++不支持這個,正如你們許多人所解釋的那樣。我(痛苦地)一直在學習設置我的滾動參數。大多數情況下它按預期工作,但我仍然遇到滾動條的問題。我希望滾動條出現在面板的右側,併爲我的主題面板留下其餘空間。相反,它會略微偏移,並且該區域的其餘部分被繪成淺灰色而不是TopicHolder的背景顏色。現在它只是令人煩惱,但我希望看到它解決。再次,任何幫助將不勝感激。
在Windows API,你是負責處理所有滾動自己;很少有自動支持滾動(有一個函數實際上移動你的窗口和子窗口的像素和函數來操縱滾動條,但就是這樣)。 [Raymond Chen的滾動條系列](http://stackoverflow.com/a/29469939/1889329)是如何進行滾動的實際標準指南。 – andlabs