Jump to content
  • Announcements

    • Xmat

      Pravidlo pro postování v TTT

      Do sekce Tipy, triky, tutoriály nepatří žádné dotazy.   Postujte sem vaše návody, tipy a různé další věci jež uznáte za vhodné sdělit zdejšímu osazenstvu, ale veškeré dotazy směřujte do sekce Všeobecná diskuse.
    • Replik

      Seznam návodů a důležitých témat v této sekci

      Pro lepší přehlednost jsem vytvořil tento seznam, který vás, méně zkušené, lépe provede touto sekcí. Věřím, že zde najdete, co hledáte. Vypsané jsou návody, které jsou oficiálně uznané jako návody. Běžné diskuze, které neposkytují postupy a rady zvěřejněny nejsou.   Instalace vlastního MaNGOS Serveru Díky těmto návodům budete (měli by jste být) schopni vytvořit a následně spustit váš vlastní server. Nastavení je pro verze s i bez datadisku.   Instalace MaNGOS Serveru (bez datadisku TBC) - Autor Benny Instalace MaNGOS Serveru (s datadiskem TBC) - Autor Malfik Instalace MaNGOS Serveru v prostředí Linux - Autor charlie Instalace MaNGOS Serveru v prostředí Linux - Autor kupkoid   Chyby a jejich řešení při přihlašování k serveru - Autor Cybe   Zálohování uživatelských dat   Dávkový soubor (BAT soubor) pro vytvoření SQL záloh - Autor Replik   Kompilování - tvoření vlastních release (revizí)   Tvorba kompilací pro Win32 (MangoScript) - Autor bLuma   Ostatní - těžko zařaditelné, ale neznamená to, že nejsou dobré   VIP Systém - Autor charlie Tvorba Webových stránek pro MaNGOS - Autor zahuba Tvorba teleportačních NPC (MangoScript) - Autor Replik Registrační web (původně předělaná SPORA) Funkční pro Antrix i MaNGOS - Autor Replik Nastavení a spuštění Minimanager pro MaNGOS - Autor BlackMartin Nastavení MaNGOS Website - Autor Artorius   Samozřejmě jsou zde i jiné návody, ale tyto jsou nejvíce používané, proto věřím, že vám budou nápomocné. Tuto sekci budeme upravovat podle potřeby. Pokud by jste něco nenašli nebo si nevěděli rady, hledejte na fóru a teprve potom založte vlastní topik. Pokud nějaký autor vytvoří kvalitní návod a chtěl by ho zveřejnit i v tomto seznamu, doporučuji, aby mi napsal zprávu skrze PM.   Díky a přeji hezký den na WoWResource   Replik
    • Aristo

      Příspěvky tam, kde nemají co dělat

      Dodržujte zákaz přispívání do topiků s repaky pokud si to zakladatelé nepřejí!! Opakované psaní příspěvků bude trestáno warnem.
    • Aristo

      Používání spoilerů

      Poslední dobou má většina uživatelů fora zvláštní nutkání postovat extrémně dlouhé texty nebo kódy, které zabírají v nejedenom případu i 80% obsahu celé stránky a hodně tak zvedají nepřehlednost v topiku. Chtěl bych všechny uživatele požádat, aby při postování citací, jakýchkoliv kódů, errorů, atp... delších než 30 řádků používali funkci spoileru.   Funkci vyvoláte příkazem [spoiler] text [/spoiler]   Ukázka:  
Sign in to follow this  
SEnergy!

[Win32 API] Owner-Draw Buttons

Recommended Posts

Zdar,

 

vedel by mi niekto poradit ako spravit owner-draw button v "cistom" c++ (API)? nasiel som len mfc a zopar na*PIP* vysvetlenych tutorialov, ak by mal niekto zaujem mi pomoct, pridajte si ma na msn: [email protected] alebo icq: 425692719

 

Dakujem!

Share this post


Link to post
Share on other sites

Jestli máš nějakej hlubší zájem na tom pochopit to, vylepšit to ... Mám zde v PC několik snippetů funkcí i na práci s resource (tzn. obrázky jsou součástí EXE souboru, ty pak extrahuji, převádím na bitmapy (když jsou ve formátu jpeg, gif, png, atd... (kvůli velikosti)) které ukládám do operační paměti a odtud je dále v programu používám)... Princip je hodně podobnej, žádný MFC ani AFX - čistě jen WinAPI. Když jsem to řešil, stálo mě to 3 dni hledání a testování. Tenkrát jsem psal launcher pro wow (mám tam i vlastní kurzor (z wow), hudba mi k tomu hraje (mp3, také z wow), atd...)

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

no ja pracujem LEN s resource, kedze je v tom lepsi prehlad ako vo veciach spravenych pocas run-time, ale ten launcher ma zaujima :) ja som skusal robit launcher na AION cez ShellExecute ale nejako to neslo :X ak by si mi chcel pomoct pridaj si ma na MSN, v main poste to je :P

Share this post


Link to post
Share on other sites

Na extrakci obrázků mám vychytanou tuto funkci (extrahuje i JPEG, GIF atd.. do BMP (RAW bitmap)):

 

#include <olectl.h>
#pragma comment(lib, "comctl32.lib")    // olectl.h - je treba prilinkovat tuto knihovnu

HBITMAP LoadImageFromResource(UINT resId, LPTSTR resType)
{
   HBITMAP bitmap = NULL;
   HRSRC resHandle = FindResource(NULL, MAKEINTRESOURCE(resId), resType);

   if (resHandle)
   {
       HGLOBAL memData = LoadResource(NULL, resHandle);

       if (memData)
       {
           DWORD resSize = SizeofResource(NULL, resHandle);
           HGLOBAL globalData = GlobalAlloc(0, resSize);
           LPVOID lockedData = GlobalLock(globalData);
           memcpy(lockedData, memData, resSize);
           GlobalUnlock(globalData);
           LPSTREAM pStream = NULL;
           CreateStreamOnHGlobal(globalData, FALSE, &pStream);
           LPPICTURE pPicture = NULL;
           OleLoadPicture(pStream, resSize, TRUE, IID_IPicture, (LPVOID*)&pPicture);

           if (pPicture)
           {
               HBITMAP handle = NULL;
               pPicture->get_Handle((unsigned int*)&handle);
               bitmap = (HBITMAP)CopyImage(handle, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG);
               pPicture->Release();
           }

           pStream->Release();
           GlobalFree(globalData);
       }
   }

   return bitmap;
}

 

Použití funkce LoadImageFromResource (mám to jako globální proměnné, což je moje chyba...):

// Bitmaps
HBITMAP BackgroundImage    = LoadImageFromResource(IDJPG_BACKGROUND, _T("JPEG")); // Obrázek na pozadí
HBITMAP ButtonImageNormal  = LoadImageFromResource(IDJPG_BUTTON_NOR, _T("JPEG")); // Obrázek tlačítek normální
HBITMAP ButtonImageSelect  = LoadImageFromResource(IDJPG_BUTTON_SEL, _T("JPEG")); // Obrázek tlačítek při kliknutí

 

K extrakci soubrů z resource na pevný disk používám následující funkci (týká se to binárních soubrů (třeba MP3 souborů - nikoliv obrázků! - není potřeba ukládat obrázky v RAW (BMP) na HDD!)):

 

void ExtractResource(const HINSTANCE hInstance, WORD resId, const char* outputFilename)
{
   // First find and load the required resource
   HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resId), "BINARY");

   if(hResource==NULL)
       return;

   HGLOBAL hFileResource = LoadResource(hInstance, hResource);

   // Now open and map this to a disk file
   LPVOID lpFile = LockResource(hFileResource);
   DWORD dwSize = SizeofResource(hInstance, hResource);

   // Open the file and filemap
   HANDLE hFile = CreateFile(outputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW,
                             FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN, NULL);

   HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);
   LPVOID lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);

   // Write the file
   CopyMemory(lpBaseAddress, lpFile, dwSize);

   // Unmap the file and close the handles
   UnmapViewOfFile(lpBaseAddress);
   CloseHandle(hFilemap);
   CloseHandle(hFile);
}

 

 

Uživatelsky kreslená tlačítka. Fajn. Takže když jsme si vysvětlili jak získáme handle obrázku, data obrázku a jak je to vlastně s temi soubory, můžeme pokračovat.

 

Já mám třeba tuto funkci:

 

void OnDrawItem(LPDRAWITEMSTRUCT lpDIS)
{
   if(lpDIS->itemState & ODS_SELECTED)
   {
       DrawFrameControl(lpDIS->hDC, &lpDIS->rcItem, DFC_BUTTON, DFCS_FLAT | DFCS_BUTTONPUSH | DFCS_PUSHED);
       FillRect(lpDIS->hDC, &lpDIS->rcItem, hbButtonImageSelect);
       lpDIS->rcItem.top     += 2;
       lpDIS->rcItem.bottom  += 2;
       lpDIS->rcItem.left    += 2;
       lpDIS->rcItem.right   += 2;
   }
   else
   {
       DrawFrameControl(lpDIS->hDC, &lpDIS->rcItem, DFC_BUTTON, DFCS_FLAT | DFCS_BUTTONPUSH);
       FillRect(lpDIS->hDC, &lpDIS->rcItem, hbButtonImageNormal);
   }

   SetBkMode(lpDIS->hDC, TRANSPARENT);
   SetTextColor(lpDIS->hDC, RGB(0xFF, 0xFF, 0xFF));

   switch(lpDIS->CtlID)
   {
   case ID0_BUTTON0:
       DrawText(lpDIS->hDC, TEXT("O programu.."), -1, &lpDIS->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
       break;

   case ID0_BUTTON1:
       DrawText(lpDIS->hDC, TEXT("Spustit"), -1, &lpDIS->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
       break;

   case ID0_BUTTON2:
       DrawText(lpDIS->hDC, TEXT("KONEC"), -1, &lpDIS->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
       break;
   }
}

 

 

Ve funkci LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) pak mám něco takového:

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   int wmId, wmEvent;
   PAINTSTRUCT ps;
   HDC hdc;

   Settings settings;

   switch (message)
   {
   case WM_COMMAND:
       wmId    = LOWORD(wParam);
       wmEvent = HIWORD(wParam);

       switch (wmId)
       {
       case ID0_BUTTON0:
           /* ABOUT */
           break;

       case ID0_BUTTON1:
           /* PLAY */
           break;

       case ID0_BUTTON2: // EXIT
           PostQuitMessage(0);
           break;

       default:
           return DefWindowProc(hWnd, message, wParam, lParam);
       }
       break;

   case WM_PAINT:
       hdc = BeginPaint(hWnd, &ps);
       SetTabHWND(hWnd);
       DrawState(hdc, NULL, NULL,(LPARAM)BackgroundImage, 0, 0, 0, 0, 0, DST_BITMAP);
       EndPaint(hWnd, &ps);
       break;

   case WM_DRAWITEM:
       OnDrawItem((LPDRAWITEMSTRUCT)lParam);
       break;

   case WM_CLOSE:
       DestroyWindow(hWnd);
       break;

   case WM_DESTROY:
       PostQuitMessage(0);
       break;

   default:
       return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

 

 

Hele, není to dokonalý, ani dokonale podaný, ale... Doufám že tě to nějak nasměruje a pochopíš to.

Je fakt důležitý nastudovat si to, třeba na netu. Na co jsem tě před tím odkázal na builderu.. ..asi si budeš muset k těm funkcím vyhledat další - jiné zdroje - třeba na google. Můžeš se z toho hodně naučit..

 

Snaž se to chápat. Uč se to - nekopíruj tady tupě to, co ti napíšu. Jasný? :)

 

EDIT: Vím že to asi moc dobře nechápeš, psal jsem to dost na rychlo a jsou to opravdu vyňaté kódy z hotového programu který je celkem komplikovaný a rozsáhlý. Jakýkoliv problém budeš mít, nestyď se napsat. :teehee:

 

EDIT2: Mimojiné, sleduj ten launcher. Škoda jen že není platná adresa k záskání obsahu novinek ze serveru. http://czshare.com/2168147/LauncherTest%28v0.13%29.zip Ale základ tam vidíš. Hlavně POZOR! Hraje to a je to docela nahlas. ;)

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×