Zum Inhalt springen

TinTin

Mitglieder
  • Gesamte Inhalte

    433
  • Benutzer seit

  • Letzter Besuch

Beiträge von TinTin

  1. Servus,

    ich habe in einem Dialog ein Steuerelement von Typ CCheckListBox.

    In diesem Kann ich die einzelnen Items mit der rechten Maustaste

    markieren. Die Eigenschaften stehen u.a. auf Einzelauswahl.

    Ich habe mir überlegt, dass ich die Items aber auch gerne mit der

    rechte Maustaste markieren und ein Kontextmenu anzeigen möchte.

    so sieht mein Code aus:

    void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    
    {
    
    
    //	Info: CCheckListBox	m_lbFileList;
    
    
    	CRect rect;
    
    	BOOL bIsItem = FALSE;
    
    	int iStep = 0, iCount = m_lbFileList.GetCount();
    
    	while (iStep < iCount && bIsItem == FALSE)
    
    	{
    
    
    		m_lbFileList.GetItemRect(iStep,rect);
    
    		ClientToScreen(&rect);
    
    		bIsItem = rect.PtInRect(point);
    
    		iStep++;
    
    	}
    
    	if (bIsItem == TRUE)
    
    	{
    
    		m_lbFileList.SetCurSel(iStep-2);
    
    
    		CMenu menu;
    
    		if (menu.LoadMenu(IDR_MENU_LIST))
    
    		{
    
    			CMenu *psmenu = menu.GetSubMenu(0);
    
    			ASSERT(psmenu);
    
    			psmenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x ,point.y, this); 
    
    		}	
    
    	}
    
    
    }

    Diese Code funktioniert, bis auf einen kleinen Fehler. Wenn ich auf den letzten

    Eintrag der ListBox klicke (rechts), wird der Eintrag nicht markiert und ich bekomme

    kein Menü. (bIsItem = FALSE)Bei allen anderen Items Funktioniert der Code.

    Meine Frage, was übersehe ich hier?

    Gibt es einen anderen, besseren Ansatz?

    Ciao TinTin

  2. Von Windows aus kannst Du die Datei mit dem normalen Netzwerkpfad öffnen, wie jede andere Datei, z.B.:

    FILE* pFile = fopen( "\\\\Compi\\Pfad\\Datei.ext", "r" );

    Was ist, wenn der Pfad "\\\\Compi\\Pfad\\" nicht für den angemeldeten Nutzer

    des zugreifenden Rechners freigegeben ist, kann ich dann Nutzer und Passwort

    übergeben?

    TinTin

    EDIT: Ich hätte den Thread auch zuende lesen sollen, egal, eine Antwort gab es bisher ja noch nicht.

  3. Und es ist natürlich Quatsch, Adressen von globale Variablen als Threadparameter zu übergeben. An globale Variablen kommst du ja auch so ran.

    Wie Recht du hast ich war wohl geistig etwas verwirrt.

    Das mit den Syncronisierungsobjekten sieht ganz interessant aus, ist mir für den

    Moment aber zu aufwendig. Ich lege die Parameter auf den Heap, dass sollte

    für den Moment reichen.

    Danke für Deine Hilfe,

    TinTin

  4. Wie ist ta deklariert? Ist das eine lokale Variable? Falls ja, könnte das zu den oben erwähnten Problemen führen, falls du mal nicht auf das Ende des Threads wartest.

    ta ist lokal in einer Dialogklasse deklariert, beinhaltet aber 'nur' zwei Pfade, die direkt inder

    TreadFunktion genutzt werden. kann ich aber auch global deklarieren.

    Zweitens: Wenn du Zeiger in deiner threadArgs-Struktur benutzt, gilt für die Lebensdauer der Objekte, auf die diese Zeiger verweisen, das gleiche wie für die Struktur selbst.

    Was ist denn sinnvoller, denn meinem Code sind die ta-Member Zeiger auf

    zwei Klassen-Menbervariablen

    
    	threadArgs ta;
    
    	ta.lpDBPath = m_csDBFullPath;
    
    	ta.lpZipName = m_csFullBackUpPath;
    Und drittens ist ein Thread ziemlich sinnlos, wenn du gleich nach dem Starten auf das Ende wartest. Oder war das nur ein Beispiel?
    Ist nur ein Beispiel und
    WaitForSingleObject(hThread, INFINITE);

    hat da auch Nichts mehr zu suchen

    TinTin

  5. Danke, so schauts aus.

    typedef struct threadArgs
    
    {
    
      LPCTSTR lpDBPath;
    
      LPCTSTR lpZipName;
    
    } threadArgs; 
    
    
    DWORD WINAPI threadCreateZip(LPVOID lParam)
    
    {
    
    
    	threadArgs *ta;
    
    	ta = (threadArgs*) lParam; 
    
    	TRACE("arg1:%s arg2:%s",ta->lpZipName,ta->lpDBPath);
    
    	return 0;
    
    }
    
    ...
    
    HANDLE hThread = CreateThread(NULL,
    
    				0,
    
    				threadCreateZip,
    
    				(LPVOID)&ta,
    
    				NULL,
    
    				&ThreadId);
    
    
    	if (hThread != INVALID_HANDLE_VALUE)
    
    	{
    
    		WaitForSingleObject(hThread, INFINITE);
    
    		DWORD dwExitCode;
    
    		GetExitCodeThread(hThread, &dwExitCode);
    
    		CloseHandle(hThread);
    
    		return;
    
    	}

  6. Servus Gemeinde,

    ich suche nach einer Möglichkeit einen CString als Parameter in eine

    ThreadFunktion zu übergeben. Bei CreateThread steht mir ja LPVOID als

    Paremeter zu Verfügung. Wie bekomme ich den dazu einen CString zu akzeptieren?

    TinTin

    
    DWORD WINAPI  threadCreateZip(CString test)
    
    {
    
    
    		AfxMessageBox(test);
    
    		return 0;
    
    }
    
    
    	CreateThread(NULL,
    
                                    0,
    
                                    threadCreateZip,
    
                                    test,
    
                                    NULL,
    
                                    &ThreadId);
    
    

    So gehts natürlich nicht, aber so sollte es im Prinzip aussehen.

  7. So, lange Zeit ist vergangen und ich bin mitlerweile bei einem MDI

    Projekt mit CRichEditView. Das ganze ist ein kleiner Editor (Übung).

    Jetzt habe ich angefangen mich mit der Druckerei zu beschäftigen.

    Setenränder setzen mit SetMargin und Ausdruck funktioniert auch.

    Mein Problem ist jedoch, dass der Drucker immer ein Blatt zuviel

    ausspuckt, d.h. nach dem letzten bedruckten Blatt kommt immer

    noch ein leeres Blatt hinterher.

    Das ist der momentane Code für das Drucken

    
    BOOL CRichPrintView::OnPreparePrinting(CPrintInfo* pInfo)
    
    {
    
    	SetMargins(CRect(720, 720, 720, 720));
    
    
    	return  DoPreparePrinting(pInfo);
    
    }
    
    
    void CRichPrintView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
    
    {
    
    	CRichEditView::OnBeginPrinting(pDC, pInfo);
    
    }
    
    
    void CRichPrintView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
    
    {
    
    	CRichEditView::OnEndPrinting(pDC, pInfo);
    
    }
    
    
    Wenn ich
    BOOL CRichPrintView::OnPreparePrinting(CPrintInfo* pInfo)
    
    {
    
    	SetMargins(CRect(720, 720, 720, 720));
    
    	Info->SetMaxPage(1);
    
    	return  DoPreparePrinting(pInfo);
    
    }

    eintrage, bekomme ich nur eine Seite, was logisch ist.

    Wie bekomme ich raus wieviele Seiten mein Dokument hat, damit ich das Ganze mit SetMaxPage() angeben kann.

    Ich hoffe ich habe mich verständlich ausgedrückt.

    TinTin

  8. Morgen zusammen,

    die Woche fängt ja gut an. Ich habe mir dummer Weise die dsp Datei meines

    Projektes gelöscht. Nun bekomme ich das ganze nicht mehr ans laufen. Ich habe

    ein neues Projekt erstellt und alle *.cpp, *.h, *.rc ,*.rc2 dem Projekt

    hinzugefügt. Wenn ich das Projekt erstelle bekomme ich folgende Fehlermeldung

    
    ChildFrm.cpp
    
    Linker-Vorgang läuft...
    
    nafxcwd.lib(thrdcore.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __endthreadex
    
    nafxcwd.lib(thrdcore.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __beginthreadex
    
    Debug/pr.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
    
    Fehler beim Ausführen von link.exe.
    
    

    Was muß ich denn noch machen, was habe ich vergessen?

    TinTin

  9. So, ich habs geschafft. Ich bin mir zwar nicht sicher ob das der beste weg ist

    aber es funktioniert erst mal.

    
    CMyView::CPrint2View()
    
    {
    
       m_cfoScreen = new CFont();
    
    }
    
    
    CMyView::~CPrint2View()
    
    {
    
       delete m_cfoScreen;
    
    }
    
    
    void CMyView::OnInitialUpdate() 
    
    {
    
    	CEditView::OnInitialUpdate();
    
    
    	LOGFONT lf;
    
    	lf.lfHeight =-16;
    
    	lf.lfWidth = 0;
    
    	lf.lfEscapement = 0;
    
    	lf.lfOrientation = 0;
    
    	lf.lfWeight = 400;
    
    	lf.lfItalic = 0;
    
    	lf.lfUnderline = 0;
    
    	lf.lfStrikeOut = 0;
    
    	lf.lfCharSet = 0;
    
    	lf.lfOutPrecision = 3;
    
    	lf.lfClipPrecision = 2;
    
    	lf.lfQuality = 1;
    
    	lf.lfPitchAndFamily = 49;
    
    	strcpy(lf.lfFaceName, _T("Courier New"));
    
    	m_cfoScreen->CreateFontIndirect(&lf);
    
    	SetFont(m_cfoScreen);
    
            SetPrinterFont(m_cfoScreen);
    
    }
    
    

    Der eingestellte Font ist Courier New, Standard, 12, Westlich.

    Für weitere Anregungen und Verbesserungsvorschläge bin ich jetzt schon

    dankbar.

    TinTin

  10. So,

    es scheint ja keiner was bzgl. eines guten Tutorials zu wissen, schade.

    Nun schlage ich mich selber mit diesem Thema herum. Ich habe auch mittlerweile

    ein MDI Projekt mit einem CEditView auf die beinegestellt und die Druckerei so

    einigermassen im Griff. Jetzt suche ich nach einer Möglichkeit in der View den

    Font und PrinterFont vorzubelegen, so dass es standardmässig mit Courier New

    belegt ist.

    Wo ist denn die Stelle an der ich das am besten Anbringe?

    TinTin <- der langsam verzweifelt weil er keine guten Beispiele findet.

  11. Servus,

    Ich habe mich bisher fast ausschlieslich mit dialogbasierenden Anwendungen

    beschäftigt. Jetzt suche ich nach einem gut dokumentierten Tutorial zu o.g.

    Thema. Etwas wo schrittweise der Aufbau einer solchen Anwendung mit dem

    VST/VC++ 6.0 erklärt wird. Die MSDN Beispiele WORDPAD,MULTIPAD,SUPERPAD

    sind leider schon fertig. Ich such etwas, wo man den Aufbau und die Zusammen-

    hänge nachvollziehen kann.

    TinTin

  12. Es sollte ausreichen, wenn du statt GetWindowRect GetClientRect verwendest.

    Das ist noch nicht ganz die Lösung.

    CWnd *wnd = GetDlgItem(IDC_ED_COMMENT);
    
    	wnd->GetClientRect(&rect);
    ergibt: {top=0 bottom=16 left=0 right=121} (das sind nicht die Koordinaten im Client, die Maße des Feldes)
    
    rect.bottom += 28;
    
    wnd->MoveWindow(rect,TRUE);

    setzt mir das Editfeld dann auch genau ins linke obere Eck des Fenster.

    Was auch logisch ist.

  13. 
    void CMyDlg::OnSetfocusEdComment() 
    
    {
    
    	CRect rect;
    
    	CWnd *wnd = GetDlgItem(IDC_ED_COMMENT);
    
    	wnd->GetWindowRect(&rect);
    
    	rect.bottom = (rect.bottom + 28);
    
    	wnd->MoveWindow(rect,TRUE);
    
    	UpdateWindow();
    
    }
    
    

    Funktioniert bei mir.

    Wen ich den Code bei mir einfüge, dann verschiebt es mir das Editfeld

    an eine ganz andere Stelle. Die Höhe wird geändert, aber das ganze Editfeld

    verschiebt sich. Kann es eventuell daran liegen, dass das Editfeld in einem

    Static Rahmen liegt? Denn es wird aus diesem verschoben und liegt dann

    daneben.

    TinTin

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...