Diskussion zum Artikel "Panels verbessern: Transparenz hinzufügen, Hintergrundfarbe ändern und von CAppDialog/CWndClient übernehmen" - Seite 2

 

Vladimir, danke für die Artikel, sehr nützliches Material. Ich habe vielleicht eine lahmere Frage...

Es gibt ein Objekt vom Typ CBmpButton - eine Schaltfläche mit einem Bild. Das Bild der Schaltfläche selbst fungiert hier also als Ressource. Wie kann man auf seine Eigenschaften zugreifen? Oder ist das unmöglich?

Ein Beispiel aus der Dokumentation.

Dort habe ich mit der Methode CControlsDialog::CreateBmpButton1() gespielt:

//+------------------------------------------------------------------+
//| Erstellen Sie die Schaltfläche "BmpButton1".|
//+------------------------------------------------------------------+
bool CControlsDialog::CreateBmpButton1(void)
  {
//--- Koordinaten
   int x1 = INDENT_LEFT;
   int y1 = INDENT_TOP + (EDIT_HEIGHT + CONTROLS_GAP_Y);
   int x2 = x1 + BUTTON_WIDTH;
   int y2 = y1 + BUTTON_HEIGHT;
//--- erstellen
   if(!m_bmpbutton1.Create(m_chart_id, m_name + "BmpButton1", m_subwin, x1, y1, x2, y2))
      return(false);
//--- legt den Namen der bmp-Dateien des Controls CBmpButton fest
   string name1, name2;
   name1 = "\\Images\\euro.bmp";
   name2 = "\\Images\\dollar.bmp";
   m_bmpbutton1.BmpNames(name1, name2);
   if(!Add(m_bmpbutton1))
      return(false);
   m_chart.Redraw();
   if(ObjectFind(m_chart_id, name1) >= 0)
     {
      DebugBreak();
     }
//--- erfolgreich
   return(true);
  }
//+------------------------------------------------------------------+

Das Objekt des Bildes selbst auf dem Panel wird mit ObjectFind() nicht gefunden, was ganz natürlich ist. Wie kann man es finden, wenn es überhaupt möglich ist?

Danke!

 
Denis Kirichenko:

Vladimir, danke für die Artikel, sehr nützliches Material. Ich kann eine lahmere Frage haben.....

Es gibt ein Objekt vom Typ CBmpButton - eine Schaltfläche mit einem Bild. Das Bild der Schaltfläche selbst fungiert hier also als Ressource. Wie kann ich auf seine Eigenschaften zugreifen? Oder kann ich das nicht?

Beispiel aus der Dokumentation.

Dort habe ich mit der Methode CControlsDialog::CreateBmpButton1() gespielt:

Das Objekt des Bildes selbst auf dem Panel wird mit ObjectFind() nicht gefunden, was ganz natürlich ist. Wie kann man es finden, wenn es überhaupt möglich ist?

Danke!

Ein Bild (eine Zeichnung) ist kein Objekt. Objekte sind Linien, Rechtecke ... grafische Elemente.

 

Hallo, Vladimir. Du hast dem Fenster eine zusätzliche ClientArea hinzugefügt. Und dann verwendest du die Methode CMyWndClient::ShiftButton, um Schaltflächen zu verschieben. Das ist nicht sehr praktisch, weil es viele Schaltflächen im Fenster geben kann. Außerdem kann es neben den Schaltflächen noch eine Menge anderer UI-Elemente geben. Sie sehen also, dass es eine Herausforderung ist, Methoden für jedes Element zu schreiben und nicht zu vergessen, sie in Scrolling-Handlern aufzurufen. Ist es nicht einfacher, die ClientArea zu scrollen ? Dann werden alle darin enthaltenen UI-Elemente automatisch gescrollt. Es reicht aus, in den Handlern nur das Scrollen der ClientArea anzugeben .

 
Mihail Matkovskij #:

Hallo, Vladimir. Du hast dem Fenster eine zusätzliche ClientArea hinzugefügt. Und dann verwendest du die Methode CMyWndClient::ShiftButton, um Schaltflächen zu verschieben. Das ist nicht sehr praktisch, weil es viele Schaltflächen im Fenster geben kann. Außerdem kann es neben den Schaltflächen noch eine Menge anderer UI-Elemente geben. Sie sehen also, dass es eine Herausforderung ist, Methoden für jedes Element zu schreiben und nicht zu vergessen, sie in Scrolling-Handlern aufzurufen. Ist es nicht einfacher, die ClientArea zu scrollen ? Dann werden alle darin enthaltenen UI-Elemente automatisch gescrollt. Es reicht aus, in den Handlern nur das Scrollen der ClientArea anzugeben .

Bitte schreiben Sie ein solches Beispiel. Ich denke, jeder wird an einer solchen Implementierung interessiert sein.

 
Vladimir Karputov #:

Bitte schreiben Sie ein solches Beispiel. Ich denke, jeder wird an einer solchen Implementierung interessiert sein.

Nach einigem Nachdenken habe ich es herausgefunden. Ein solches Scrolling kann nicht implementiert werden, weil es nicht möglich ist, beliebige Diagrammobjekte (in diesem Fall ClientArea und Schaltflächen) teilweise auszublenden. In anderen UIs ist es anders implementiert. Dort wird ein rechteckiger Bereich angezeigt, der in den Bildlaufbereich fällt , und alles andere wird ausgeblendet. Daher die Verwirrung.

 
Perfekt
 
Danke, Vladimir, tolle Arbeit.
Wie könnten wir Transparenz für die Kopfzeile erreichen?