-
Gesamte Inhalte
433 -
Benutzer seit
-
Letzter Besuch
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Beiträge von TinTin
-
-
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
-
Servus!
Klar ist der Thread alt, aber warum einen neuen aufmachen?
Ich habs ja schon befürchtet und auch nichts Anderes gefunden.
Dennoch danke für deine Mühe.
TinTin
-
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.
-
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
-
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;
Ist nur ein Beispiel undUnd drittens ist ein Thread ziemlich sinnlos, wenn du gleich nach dem Starten auf das Ende wartest. Oder war das nur ein Beispiel?WaitForSingleObject(hThread, INFINITE);
hat da auch Nichts mehr zu suchen
TinTin
-
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; }
-
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.
-
Super,wäre noch schön zu wissen wie du es gemacht hast.
TinTin
-
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 ichBOOL 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
-
Hallo Klotzkopp,
ich habe jetzt in den Einstellungen unter Allgemein die MFC Konfiguration
auf 'MFC in einer gemeinsam genutzten DLL verwenden' eingestellt und jetzt
läuft das Projekt wieder.
War es das was du meintest?
TinTin
-
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
-
@Klotzkopp:
Danke, habe ich berücksichtigt.
@Alle:
So, jetzt stehe ich vor dem nächsten Problem. Ich möchte, dass beim Laden der
View eine festegelegte Textdatei in die EditView geladen wird. Wo stelle ich das
am geschicktesten an. Ich denke, dass die Serialize() - Funktion ist ein Ansatz
den ich versuchen werde.
TinTin
-
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
-
Schnapp dir einen der das schon 100 Mal gemacht hat, und lass es dir am PC mit Visual Studio 6 vorführen... Hat bei mir gut geklappt....
Und wo soll ich mir den herholen? Kann ich mir irgendwo einen wegnehmen?
Wo stehen die denn rum?
TinTin
-
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.
-
in der registry.
-> regedit -> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\ServicePacks
@Amstelchen:
Danke für die Info, man lernt doch immer wieder dazu.
-
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
-
hoppalla,
erschreckend ist, dass das schon so alt ist und immer noch stimmt.
-
Hallo Gemeinde,
schon mal nach 'failure' gegoogelt?
Sehr interessant was sich dort als erstes findet.
Ciao TinTin
-
Danke Klotzkopp,
dass ist die Lösung. ScreenToClient hab ich gesternauch gefunden, hatte aber
leider noch keine Zeit zu posten. Dank auch nochmal an alle für Eure Bemühung.
TinTin
-
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.
-
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
-
void CMyDlg::OnSetfocusEdComment() { CRect rect; CWnd *wnd = GetDlgItem(IDC_ED_COMMENT); wnd->GetWindowRect(&rect); rect.bottom = rect.bottom + 28; wnd->SetWindowPos(wnd,rect.left,rect.top,rect.right,rect.bottom,NULL); UpdateWindow(); }
Mal sehen, jetzt gehts erst mal nach hause, schönes wochenende
-
ja.
CWnd *wnd = GetDlgItem(IDC_ED_COMMENT); wnd->GetWindowRect(&rect); rect.bottom = rect.bottom + 28; wnd->SetWindowPos(wnd,rect.left,rect.top,rect.right,rect.bottom,NULL); UpdateWindow();
so bewegt sich auch nichts.
[VC++6,SP6,MFC]CCheckListBox Item markieren mit 'rechts' und Kontextmenü
in C++: Compiler, IDEs, APIs
Geschrieben
Die MSDN sagt dazu folgendes:
Und Sie hat recht, unter win2000 bekomme ich kein brauchbaren Ergebnisse,
darum ja der ganze 'Quatsch'.