Dialog, aus DLGTEMPLATE struct, mit rich edit control



  • Gruesset euch,

    derzeit schreibe ich eine Logging Klasse mit der man unter anderem auch die Ausgabe in ein Fenster umleiten kann. Um das zu realisieren wollte ich einen Dialog erstellen der ein Rich Edit Control beinhaltet (um auch einzelnen Woerter + Hintergrund farbig zu machen. wuerde das auch mit einem anderm gehen?).
    Nun hab ich aber Probleme mit dem erstellen eines Dialog-Templates. Wie genau funktioniert das mit den "DLGITEMTEMPLATE ... aligned on DWORD boundaries" und gibts bei den DlgItemTemplate keinen vorgegebenen Wert fuer ein Rich Edit Control? Fuer Button, Edit, List-Box gibts ja was.

    Danke es euch C0de4Fun


  • Mod

    Alligned heißt, dass eben jedes Element auf einem glatten DWORD anfängt...

    Du kannst den Klassennamen direkt angeben.

    Am einfachsten ist es, wenn Du den Dialog definierst in einer Test-EXE, wie Du es möchtest und dann per FindResource/LoadResource Dir das Image mal selbst ansiehst. Oder mit einem Hex-Editor...



  • Hi,

    also ich hab jetzt auch den Beitrag aus der FAQ (InputBox) gefunden und glaub ich lass des einfach und mach das mit einem normalen Fenster.

    Aber jetzt trotzdem noch schnell ne frage zu deinem Tip Martin.

    Ich hab jetzt ein Programm erstellt mit dem gewuenschten Dialog und hab mit FindResource/LoadResource die Bytes ausgegeben. Jezt hab ich so versucht den Dialog zu erstellen:

    int main(int argc, char** argv)
    {
    	unsigned char pDialogData[] = {
    	0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x00, 0xC0, 0x80,
    	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00,
    	0x6F, 0x00, 0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01, 0x00, 0x01, 0x4D, 0x00, 0x53, 0x00,
    	0x20, 0x00, 0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x44, 0x00,
    	0x6C, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
    	0x84, 0x08, 0x90, 0x50, 0x07, 0x00, 0x07, 0x00, 0x30, 0x01, 0xBA, 0x00, 0xE9, 0x03, 0x00, 0x00,
    	0x52, 0x00, 0x69, 0x00, 0x63, 0x00, 0x68, 0x00, 0x45, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00,
    	0x32, 0x00, 0x30, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    	DWORD dwDialogSize = sizeof(pDialogData);
    
    	DLGITEMTEMPLATE* pDlgTemplate = (DLGITEMTEMPLATE*) new unsigned char[dwDialogSize];
    	DWORD dwLastError;
    	int dwDlg;
    
    	memcpy( pDlgTemplate, pDialogData, dwDialogSize);
    
    	dwDlg = (int)DialogBoxIndirect(NULL, (LPCDLGTEMPLATEA)pDlgTemplate, 0, DlgProc);
    	dwLastError = GetLastError();
    	return 0;
    }
    

    Das Problem ist, dass DialogBoxIndirect -1 zurueckt gibt was ja auf einen Fehler hindeutet, aber GetLastError 0 liefert. Jetzt ist die Frage wuerde das so theoretisch funktionieren?

    Gruessle C0de4Fun



  • Oh man hey ich Doffkopf. Ich hab jetzt das Problem gefunden:
    Es lag daran das ich die "Riched20.dll" nicht geladen habe 🙄.

    So jetzt nochmal mein Code:

    int main(int argc, char** argv)
    {
    static unsigned char data[] = 
    {
    	0x01,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0xc0,0x80,0x01,
    	0x00,0x00,0x00,0x00,0x00,0x3e,0x01,0xc8,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x6f,
    	0x00,0x67,0x00,0x00,0x00,0x08,0x00,0x90,0x01,0x00,0x01,0x4d,0x00,0x53,0x00,0x20,
    	0x00,0x53,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x44,0x00,0x6c,
    	0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x84,
    	0x08,0x90,0x50,0x07,0x00,0x07,0x00,0x30,0x01,0xba,0x00,0xe9,0x03,0x00,0x00,0x52,
    	0x00,0x69,0x00,0x63,0x00,0x68,0x00,0x45,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x32,
    	0x00,0x30,0x00,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    };
    
    	DWORD dwLastError;
    	int dwDlg;
    
    	HANDLE hRich = LoadLibrary("Riched20.dll");
    	if( !hRich)
    	{
    		std::cout << "Couldnt load Riched20.dll (Error Code: " << GetLastError() << ")";
    		return -1;
    	}
    
    	dwDlg = (int)DialogBoxIndirectParam(GetModuleHandle(0), (LPCDLGTEMPLATE)data, 0, DlgProc, 0);
    	dwLastError = GetLastError();
    	return 0;
    }
    

    und noch falls es wenn intersiert den Code um den Dialog aus einer Exe zu holen:

    bool LoadResAndSaveToFile(char* pszFileName, int ResID, LPCSTR pResType)
    {
    	HRSRC hDialog = FindResource(GetModuleHandle(NULL) , MAKEINTRESOURCE(ResID) , pResType);
    	DWORD dwError;
    	DWORD dwSize;
    	char* pData;
    	HGLOBAL hGlob;
    	FILE* fFile;
    
    	fFile = fopen(pszFileName, "wb");
    	if( fFile )
    	{
    		if( hDialog )
    		{
    			hGlob = LoadResource( GetModuleHandle(NULL), hDialog);
    			dwSize = SizeofResource(GetModuleHandle(NULL), hDialog);
    
    			if( hGlob )
    			{
    				pData = (char*)LockResource( hGlob);
    				unsigned char cTmp;
    				fprintf(fFile, "static unsigned char data[] = \n{"
    				for(DWORD i = 0; i < dwSize; i++)
    				{
    					cTmp = pData[i];
    					fprintf( fFile, "0x%02x,", cTmp);
    				}
    				fprintf(fFile, "\n}");
    
    			}
    			else
    				dwError = GetLastError();
    		}
    		else
    			dwError = GetLastError();
    	}
    	return true;
    
    }
    

    Ich finds aber trotzdem komisch, dass GetLastError 0 zurueck gibt.

    Praise the Lord
    C0de4Fun


Anmelden zum Antworten