Zum Inhalt springen

Schnitzelfritz

Mitglieder
  • Gesamte Inhalte

    28
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Schnitzelfritz

  1. Hi, prinzipiell ist es möglich. Am besten suchst du auf Seiten wie The Code Project - Free Source Code and Tutorials oder CodeGuru nach Besipielen. z.B. CFlatComboBox
  2. Wenn du MFC verwendest kannst du auch mal die CRectTracker Klasse probieren.
  3. Hi, Evtl. fehlt nur folgende Linie in deinem Code (stdafx.h): #include <afxtempl.h>
  4. Hab mal ein bißchen recherchiert. Vielleicht hilft dir GDI+ weiter. Die Klasse Bitmap stellt eine Funktion GetPixelFormat zur Verfügung, die einen Wert aus der PixelFormat Enumeration zurückgibt. Da gibt es auch Werte für Alpha Kanäle. GDI+ erfodert aber etwas Overhead.
  5. Hm... hab ich jetzt auch keine Patentlösung parat. Vielleicht kannst du es über GetObject rausfinden, ob es sich um ein 32 Bit Bitmap handelt (ich glaub mit niedrigerer Bit Tiefe gehen keine Alpha Kanäle :confused: ) ICONINFO nfo; ... BITMAP bm; if ( GetObject ( nfo.hbmColor, sizeof(BITMAP), &bm ) == sizeof(BITMAP) ) { // evtl. Alpha Kanal if ( bm.bmBitsPixel == 32 ) { ... } }
  6. Wenn du nur den Handle des HICON als HBITMAP brauchst, dann solltest du GetIconInfo verwenden. Du benötigst dafür noch die ICONINFO Struktur als Parameter: ... ICONINFO nfo; GetIconInfo ( hIcon, &nfo ); // das ist der Handle für das Icon als HBITMAP nfo.hbmColor; // das ist der Handle für den transparenten Bereich des Icons nfo.hbmMask; ... Falls du noch die transparente Farbe brauchst musst du die beiden Handles noch untersuchen. (GetPixel)
  7. 'out' Parameter sind in C# die "klassischen" C++ Zeiger (LPDWORD in deinem Fall). Da ich in VB. Net nicht so fit bin weiß ich nicht wie das hier heißt (ByRef, ByVal)
  8. Wie ist denn die Syntax für das C# Keyword 'out' in VB .Net?
  9. Toll, dass es jetzt klappt. Ich habe die Funktionssignatur genommen, weil es die standardsignatur für user defined messages der MFC ist. Wenn du Visual Studio 6.0 verwendest dann compiliert alles ohne Probleme. Compilierst du den selben Code z.B. mit Visual Studio .Net 2003 meckert der Compiler sofort wenn deine Funktion nicht dieser Signatur entspricht. Ob das jetzt wirklich genau der Grund war kann ich nicht 100% beantworten aber es ist durchaus möglich da der Absturz nur im Release Build aufgetreten ist. Freut mich auf jeden Fall wenn ich helfen konnte.
  10. Deine Funktionsdeklaration sieht wie VB aus. Wie rufst du die Funktion denn auf? Weist du dem zweiten Parameter vorher etwas zu? Die funktion erwartet hier eine Zeigervariable.
  11. ListCtrl weiß ich leider grad nicht auswendig :floet: Bei dem Button setzt leitest du eine Klasse von CButton ab und reagierst auf die WM_OWNERDRAW Message. Dazu muss in der Dialogressource der BS_OWNERDRAW Style für den Button gesetzt sein. Was du dann noch brauchst sind Member Funktionen mit denen du dein Bild setzen kannst. Schau evtl auch mal zu CodeGuru oder The CodeProject, da es dort schon viele solcher Klassen gibt.
  12. Hi, in diesem Fall darfst du nicht den Rückgabewert der Funktion überprüfen sondern musst den zweiten Parameter untersuchen: Die MSDN sagt folgendes:
  13. Hi Filou, dein Problem hat mich nicht mehr losgelassen, daher hab ich mir mal schnell ein Test Projekt nachgebaut. (Code ist mit VS .Net 2003 erstellt). Bei mir wurde der Nachrichtenhandler ohne Probleme geöffnet als ich in der Threadfunktion PostMessage verwendet habe. Benutzt du VS 6.0? Da ist der Compiler etwas fehlertoleranter, wenn dein Nachrichtenhandler nicht die richtige Signatur für User defined messages (WM_USER) hat. Vielleicht ist das mit ein Grund warum deine Release Build einen Fehler hat. Hier siehst du mein Testprojekt, vielleicht hilfts dir weiter: (Die Implementierung der Threadfunktion habe ich aus deinem Post übernommen. Wichtig ist die Signatur von OnCheckTermine) // CThreadTestDlg Dialogfeld class CThreadTestDlg : public CDialog { // Konstruktion public: CThreadTestDlg(CWnd* pParent = NULL); // Standardkonstruktor ... // Generierte Funktionen für die Meldungstabellen virtual BOOL OnInitDialog(); [B]afx_msg LRESULT OnCheckTermine(WPARAM wParam, LPARAM lParam);[/B] DECLARE_MESSAGE_MAP() }; #define WM_CHECKTERMINE (WM_USER+0x100) BEGIN_MESSAGE_MAP(CThreadTestDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_MESSAGE(WM_CHECKTERMINE,OnCheckTermine) //}}AFX_MSG_MAP END_MESSAGE_MAP() UINT DBUeberwachung(LPVOID pParam) { CThreadTestDlg *pWnd; pWnd=(CThreadTestDlg*)pParam; int iCounter = 0; //Dieser Thread überprüft alle 30 Sekunden die Verbindung zur Datenbank //und aktuallisiert die die Anzeige. while (g_iDBUeberwachung != 5555) //ENDLOS { //DATENBANKÜBERWACHUNG AKTIV if(g_iDBUeberwachung == SERVICE_START) { pWnd->PostMessage(WM_KEYDOWN,VK_F5,0); // Simulieren, dass die F5-Taste gedrückt wurde // Zur Aktuallisierung der Dokumentenliste // Und zur Prüfung des Status der Datenbank if(iCounter == 5) // Nur jede 10 Datenbankprüfung auch Termine Prüfen { pWnd->PostMessage(WM_CHECKTERMINE, 0, 0); iCounter = 0; } iCounter++; Sleep(1000); } //DATENBANKÜBERWACHUNG BEENDEN if(g_iDBUeberwachung == SERVICE_STOP) { return (1); } } return (0); } BOOL CThreadTestDlg::OnInitDialog() { CDialog::OnInitDialog(); // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden g_iDBUeberwachung = SERVICE_START; CWinThread *pThread = AfxBeginThread ( DBUeberwachung, this, THREAD_PRIORITY_NORMAL ); return TRUE; } [B]LRESULT CThreadTestDlg::OnCheckTermine(WPARAM wParam, LPARAM lParam)[/B] { CAboutDlg dlg; dlg.DoModal(); return 0; }
  14. Dann probiers mal ohne Adressoperator: CPatient *pWnd; pWnd=(CPatient*)CWnd::FromHandle ( (HWND)[B]pParam[/B] ); ... CWinThread *pThread = AfxBeginThread(DBUeberwachung, [B]this -> GetSafeHwnd()[/B], THREAD_PRIORITY_NORMAL);
  15. Probier mal folgendes: (notfalls den Adressoperator und die Derefernzierung weglassen. Mein C++ ist etwas eingerostet ) BEGIN_MESSAGE_MAP(CPatient, CDialog) //{{AFX_MSG_MAP(CPatient) ON_MESSAGE(WM_CHECKTERMINE, OnCheckTermine) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Therad definieren //BOOL m_bThreadEnd; UINT DBUeberwachung(void* pParam) { CPatient *pWnd; pWnd=(CPatient*)[B]CWnd::FromHandle ( (HWND)*pParam )[/B]; int iCounter = 0; //Dieser Thread überprüft alle 30 Sekunden die Verbindung zur Datenbank //und aktuallisiert die die Anzeige. while (g_iDBUeberwachung != 5555) //ENDLOS { //DATENBANKÜBERWACHUNG AKTIV if(g_iDBUeberwachung == SERVICE_START) { pWnd->PostMessage(WM_KEYDOWN,VK_F5,0); // Simulieren, dass die F5-Taste gedrückt wurde // Zur Aktuallisierung der Dokumentenliste // Und zur Prüfung des Status der Datenbank if(iCounter == 5) // Nur jede 10 Datenbankprüfung auch Termine Prüfen { // pWnd->PostMessage(WM_CHECKTERMINE, 0, 0); //Prüfen ob neue Termine vorliegen pWnd->SendMessage(WM_CHECKTERMINE,0,0); iCounter = 0; } iCounter++; Sleep(10000); } //DATENBANKÜBERWACHUNG BEENDEN if(g_iDBUeberwachung == SERVICE_STOP) { return (1); } } // return (0); } ///////////////////////////////////////////////////////////////////////////// // Diaologinitialisierung BOOL CPatient::OnInitDialog() { //Thread zur Datenbanküberwachung starten g_iDBUeberwachung = SERVICE_START; CWinThread *pThread = AfxBeginThread(DBUeberwachung, [B]&this -> GetSafeHwnd()[/B], THREAD_PRIORITY_NORMAL); } void CPatient::OnCheckTermine() { //Hier kommt das Programm nie an, stürtzt vorher ab. }
  16. Der Dialog wid erst durch den DoModal Aufruf wirklich erzeugt. Du wirst die Debug Assertion wohl bei dieser Zeile bekommen: ASSERT(::IsWindow(m_hWnd)); Entweder machst du dir einen eigenen string Member in der Klasse und in der OnInitDialog Methode kannst du dann SetWindowText aufrufen, oder du arbeitest mit Vererbung und einer Class Factory.
  17. Hm, ich glaub so wird das nichts. Kannst du vielleicht den Quellcode zur Verfügugn stellen, so dass man sich das mal anschauen kann?
  18. Probier mal PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); Die Frage ist jetzt nur noch, ob du deinen pWnd Zeiger auch in dem Thread erzeugst oder im Hauptapplikationsthread. Wie sieht deine Threadfunktion aus? Was übergibst du ihr als Parameter?
  19. Visual C++ 6.0 arbeitet normalerweise mit MFC 6.0 (mfc42.dll). Erst ab VS .NET bekommt die MFC auch einen anderen physikalischen Dateinamen. Interessant wäre auch noch zu klären welches Platform SDK ihr verwendet. Wenn ihr das mitgeliferte von VS 6.0 verwendet könnt ihr für W2k und XP nicht viel zerreisen, da zum Release Zeitpunkt von VS 6.0 W2K und W98 noch in der Beta Phase waren.
  20. Wenn ich das Problem richtig verstanden habe dann versuchst du aus einem Thread über eine Zeigervariable eines Fenster eine Nachricht an einen anderen Thread zu schicken. Hat der Thread der die Nachricht abschickt das Fenster erstellt? Du kannst keine MFC Objekte über Threadgrenzen hinweg durchreichen. Was du machen kannst ist den Window Handle übergeben und die normale API Funktion ::SendMessage(HWND,UINT,WPARAM,LPARAM) verwenden.
  21. Hi, deine erste Frage läßt sich beantworten. Mit folgendem Aufruf bekommst du den Arbeitsplatz, den du mit der BROWSEINFO Struktur verwenden kannst: LPITEMIDLIST pidl = NULL; ::SHGetSpecialFolderLocation ( m_hWnd, CSIDL_DRIVES, &pidl ); Beachte, dass du ein gültiges HWND benötigst wenn du Fehlermeldungen darstellen willst.
  22. Hm, beim direkten Speichern als Excel-Sheet bin ich jetzt auch überfragt, aber du könntest evtl. auch ein CSV-File erstellen. Excel kann das Lesen. Ich kenne leider die Möglichkeiten des MSFLEXGRID nicht. Vielleicht unterstützt es Speichern als Excel-Sheet schon. Sorry, kann dir da nicht direkt weiterhelfen
  23. Der Parent deiner Tabseiten kennt doch deine Dialogseiten (CSeite1 und CSeite2). Du kannst folgendes machen: In CSeite1 baust du deinen String zusammen und übergibst ihn in etwa so an CSeite2: (([NameDerParentKlasse]*)GetParent()) -> m_seite2.SetzeMeinenString(m_sResults)
  24. Benutzt du MFC? Wenn ja, dann kannst du mal AfxGetInstanceHandle probieren.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...