Otázky a odpovědi

V této rubrice najdete odpovědi na své otázky, které můžete zasílat na adresu vbtipy@seznam.cz. Pokud nebudeme znát odpověď na nějakou otázku, objeví se v části Otázky bez odpovědi a budete-li znát odpověď vy, můžete nám ji pomocí výše uvedené adresy zaslat, rádi ji zveřejníme.

Otázky a odpovědi

Otázky bez odpovědi

Otázky a odpovědi

  Na ChipCD 3.2000 je příklad na přehrávání zvuku přes DirectX a tak se chci zeptat, jestli na nějakém minulém CD nebylo něco o DirectDraw a případně jestli o tom bude něco v příštích číslech.

DirectX se bohužel nevěnujeme, příklady o DirectX jsou výhradně z Internetu nebo pokud je zašle nějaký čtenář. Proto nemůžeme přesně říci, zda ještě nějaké budou. Pár příkladů na použití DirectDraw bylo na Chip CD 7/1999. Na Internetu můžete nalézt informace a zdrojové kódy týkající se DirectX např. na adresách www.chez.com/scribe a msdn.microsoft.com/directx. Spousta odkazů na další servery je na www.vb-web-directory.com/game/gam_dx.shtml


  Mohli byste mi prosím vysvětlit, jak se vytvářejí formuláře, tzv. splash screen, tedy formuláře, které se objeví na obrazovce, dokud se samotný program teprve inicializuje.

Vytvářějí se úplně normálně, jako ostatní formuláře. Většinou však nemají titulkový pruh. To způsobí nastavení vlastností BorderStyle = 3, Caption = "", ClipControls = False, ControlBox = False. Zobrazení samotného formuláře potom bývá mezi prvními instrukcemi programu a po provedení všech inicializací programu se formulář zase schová. Např.:

Private Sub Main()
  frmSplash.Show
  DoEvents

  If App.Previnstance ... 'nějaké kontroly před spuštěním, otevření DB apod.
  If GetSettings( ...
  otevriDatabazi(cesta) ...
  ...

  Load frmMain
  Unload frmSplash
  frmMain.Show 'hlavní formulář aplikace
End Sub


  Pomocí API funkce InsertMenu si mohu do menu okna přidat co chci (např. "vždy na vrchu"), ale vůbec nevím, jak zajistit, aby se při kliknutí na toto menu něco provedlo.

Při přidávání menu získáte jeho ID (čtvrtý parametr funkce InsertMenu). Pomocí funkce SetWindowsLong nastavíte vlastní funkci pro obsluhu zpráv (řečeno zjednodušeně) a v ní rozpoznáte (pomocí zmíněného ID), zda někdo zvolil přidanou položku v menu, kontrolou parametrů message a wparam. Např.:

'====================== kód formuláře ======================
Private Sub Form_Load()
  insertmymenu
End Sub

Private Sub Form_Unload(cancel As Boolean)
  unloadmymenu
End Sub

'====================== kód modulu =========================
Private lngID As Long
Private lngOldProcessID As Long

Public Sub insertmymenu()
  Dim hWndSystemMenu As Long

  hWndSystemMenu = GetSystemMenu(frmMenuSample.hwnd, 0&) 'získej ID systémového menu
  InsertMenu hWndSystemMenu, 0, MF_STRING, mlngID, "moje menu" 'vlož položku menu
  'nastav novou funkci pro obsluhu zpráv
  lngOldProcessID = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf SystemMenuCallBack)
End Sub

Public Sub unloadmymenu()
  'Nastav původní obsluhu zpráv
  SetWindowLong Form1.hwnd, GWL_WNDPROC, lngOldProcessID
End Sub

Public Function SystemMenuCallBack(ByVal lnghwnd As Long, ByVal lngMessage _
  As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If lngMessage = WM_SYSCOMMAND Then 'bylo kliknuto na syst. menu
    Select Case wParam 'která položka to byla
      Case lngID
        msgbox "Moje menu"
        Exit Function
      Case Else
    End Select
  End If
  SystemMenuCallBack =CallWindowProc(lngOldProcessID, lnghwnd, lngMessage, wParam, lParam)
End Function


  Chtěl bych naprogramovat aplikaci, která by pomocí modemu zpřístupnila na jiném počítači aplikaci s databází. Problém je v tom, že nevím, jak udělat, aby ta druhá aplikace zdvihla telefon a začala komunikovat. Je vůbec možné něco takového vytvořit pomocí Visual Basicu?

Takováto akce ve Visual Basicu udělat jde. Pomocí komponenty MSComm můžete vysílat i přijímat data ze seriového portu, tzn. i AT příkazy pro modem, který je na tomto portu připojen a těmi si můžete modem ovládat, jak chcete.


  Mám dva problémy ve VB5. Nejde mi vyrobit ChooseFont dialog s použitím pouze API funkcí. Při volání mi GetLastError vrátí chybu CDERR_STRUCTSIZE. Chtěl bych používat systémová okna pro FindText a ReplaceText (opět API). Okna se mi zobrazí, ale pokud zvolím cokoliv jiného než Storno, VB se zhroutí.

Pravděpodobně je problém buď v definici struktury nebo není nastaveno, které fonty se mají zobrazit, pro tiskárnu, obrazovku nebo obojí. Zkuste strukturu naplnit takto:

cf.lStructSize = Len(cf)
cf.hwndOwner = Form1.hWnd
cf.hDC = Printer.hDC
cf.Flags = CF_BOTH Or CF_EFFECTS Or CF_FORCEFONTEXIST Or CF_INITTOLOGFONTSTRUCT Or CF_LIMITSIZE
cf.nFontType = REGULAR_FONTTYPE
cf.nSizeMin = 10
cf.nSizeMax = 72

Pokud jde o druhý problém s dialogy pro vyhledávání a nahrazení textu, netuším proč to dělá (kdo víte jak na to, napište).


Otázky bez odpovědi

  V MSDN je zmienka o použití interfacu k objektom Windows Exploreru na vloženie objektov (Listview, treeview, combo, taskbar atď ) do vlastných aplikácií, ale priložené vzory sú pre C++. Chcem Vás požiadať o nejaké moduly alebo príklady pre použitie týchto objektov, za čo Vám budem veľmi vďačný ! Zaujíma ma hlavne zobrazenie Listview, treeview, combo z exploreru a objekty z taskbaru (tabsysview, systraj objekt, objekt hodín a ponuky Štart pre vytvorenie nového typu taskbaru). Veľmi Vás prosím o pomoc.


  Rád by som získal informácie o API funkciách pre prácu s resources, spôsob ich volania vo VB a informácie potrebné pre správny chod funkcie: loadresource, findresorce, freeresource, updateresource. Chcel by som urobiť malý lokalizátor, a na to sú potrebné tieto funkcie, v angličtine (MSDN) som čosi porozumel, ale neviem ako loadnuté resource zobraziť v Image, txt objekte, a ako ich updatovať do súboru.


  Zkoušel jsem přidat bitmapu do menu pomocí API funkce SetMenuItemBitmaps. V normálním menu to funguje. Jakmile však stejný postup použiji v PopupMenu, obrázek se nezobrazí.