Şimdi Ara

c++ ile windows programları yapmak

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
28
Cevap
2
Favori
14.945
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Arkadaşlar c++ ile pencereli programlar yapmak istiyorum.
    Az çok yapabiliyorum.Pencere oluşturmayı resim çizmeyi az çok öğrendim.Ancak bir türlü kendimi gelişitiremiyorum.Bana aşağıdaki linkteki gibi anlatan site adresleri veya dökümanları verirseniz çok sevinirim.
    http://www.functionx.com/win32/Lesson07.htm

    (Not:Ayrıca verdiğim linkteki programı yazdım.Resim dosyalarınıda oluşturmama rağmen düğmelerin üzerindeki ikonlar görünmedi.
    96x32'lik olan bir resimi nasıl düğmelere böldü hiç anlamadım zaten.)

    Yardımlarınızı esirgemeyeceğinizi umuyorum.

    (Not:İngilizcem hiç iyi değildir.Lütfen vereceğiniz kaynaklar yukardaki linkteki gibi sade bir ingilizce kullansın)







  • @strom merhaba dostum

    İncelediğin site Windows programlarını API'ler ile geliştiriyor, bu yüzden sana bu kadar karışık gelmiştir.Eğer amacın sistem programlama değil, basit GUI uygulamalar oluşturmaksa hiç GUI API'ye bulaşma derim.İllede C++ yazacaksanda MFC sınıflarını kullan.Bunlar API sınıflarını sarmalar ve örneğin bir GUI uygulaması oluşturmayı daha basitleştirir.
    Verdiğin sitede sadece pencereleri ve grafik işlemlerini göstermiş(ilerisine bakmadım).Ama ciddi uygulamalar yazacaksan yerni kontroller için daha bir çok kod ve bunların mesaj yönetimi içinde yine ciddi bir kod yazman gerekir.Dediğim gibi amacın sistem programlama değil ise uğraşma.C++ 2005'de sürükle bırak yöntemi ilede GUI uygulamar oluşturabilirsin yada C# da
  • Hocam aslında amacım Pic'lerin donanım özellikleri için include dosyaları oluşturmak.Yanına birde yardım dosyası olarak Pic'in donanım özelliklerini koymak.

    Site biraz karışık geldi ama yavaş yavaş anlıyorum.
    http://www.tr3d.com/index.php?id=bilgi&kat=11&islem=liste
    http://nehe.gamedev.net/
    http://www.functionx.com/win32/Lesson01b.htm
    http://in.geocities.com/pravinparatey/win32tut/lesson3.htm
    sitelerinden faydalanarak yaklaşık 2 haftadır bu işle uğraşıyorum.Malesef hepsi ya oyun programlamak için ya da paint tarzı programlar yazmak için gerekli bilgileri veriyor.
    Alt yapıyı aldım ama bana edit(metin kutusu) gibi yazı araçlarının kullanımını anlatan kaynaklar lazım.

    Mfc işine gelince kolaya kaçmak istemiyorum.Uğraştırıcı ama zevkli bir olay programcılık.Çok uzun zamanda alsa öğrenmeye karar verdim.
    Şu an ihtiyacım olan verdiğim sitelerdeki gibi ekran çıktılarıyla ve basit bir anlatımla api öğreten kaynaklar.

    İnternette araştırma yaptım ama düzgün kaynaklara ulaşamadım.(winapi help,visual c++ windows example... gibi anahtar kelimeler kullandım ama ancak yukarıdaki gibi sitelere ulaştım.Sağlam anahtar kelimeler verseniz bile işime yarar.

    Hocam belki de bir gün bende senin gibi driver yazmaya başlarım



    < Bu mesaj bu kişi tarafından değiştirildi strom -- 14 Aralık 2007; 10:42:03 >




  • Driver Win32 API'leri ile yazılmıyor(Bu kadar kolay almasını çok isterdim)
    Sanırım amacın bir windows uygulaması yazmaktan çok daha öte..Yani uğraşmak istiyorsun.Yalnız Win32 Subsystem ile uğraşmak için yalnış yerden başlamışsın.GUI oluşturmadan önce API'lerin ne olduğunu, nasıl işlediklerini ve daha birçok konu öğrenmen lazım.Şimdi biraz internette bakındım da C Derneğin sitesinde tam istediğin tarzda makaleler varmış onları incele derim.

    Takıldığın yerler olursa ben burdayım
    Kolay Gelsin...
  • Hocam cderneğin sitesini inceledim.Orda apilerle ilgili notlar falan vardı ama pdf formatında olması notları okuma hevesimi azaltıyor.
    Neyse uzun uğraşlar sonunda programa toolbar eklemeyi başardım.Adım adım ilerliyorum.Sırada metin kutulurı hakkında bilgi toplamak ve oluşturduğum diyalog kutularını ekrana çağrmak var.(Bu konularda yardım kabul ediyorum)
    Bu arada temel almak için c ve c++ 'yı iyice öğrenmeye çalışacağım.

    (Bu arada hocam dikkat ettim de senle benim bulunduğu topiğe başka kimse girmiyor)
  • #include <windows.h> 
    #include "resource.h"

    // ana mesaj döngü fonksiyonu --> tüm mesajlar bu fonksiyondan geçecektir
    const char Classismi[] = "pencere";
    // gelen mesajları işleyen kısım
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    HWND hdialog;
    switch(msg)
    {
    case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;

    default:
    return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
    }


    static BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
    {

    switch (msg) {

    case WM_COMMAND: //düğmeye basıldı mesajı

    //hangi düğme olduğunu anlamak için mesajın alt parametresine bakıyoruz
    switch (LOWORD(wParam))
    {
    case IDOK: // ilk düğme
    EndDialog(hwndDlg,1);
    return 1;

    case IDCANCEL: // ikinci düğme
    EndDialog(hwndDlg,0);
    return 1;
    }
    break;

    case WM_CLOSE: //pencere kapatıldı mesajı gelirse
    EndDialog(hwndDlg,0); //pencereyi kapat
    return TRUE;

    }
    return FALSE;
    }

    //program girişi ana fonksiyon
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow)
    {
    WNDCLASSEX wc;
    HWND hwnd;
    HWND hdialog;
    MSG Msg;
    //birinci adım: Pencere özelliklerini belirten bir sınıf değişkeni tanımlanıyor
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = Classismi;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    if(!RegisterClassEx(&wc))
    {
    MessageBox(NULL, "Pencere tanımlama hatası!", "Hata!", MB_ICONEXCLAMATION | MB_OK);
    return 0;
    }
    // ikinci adım pencere oluşturma
    hwnd = CreateWindow(Classismi,"Pencere başlığı",WS_OVERLAPPEDWINDOW, 200, 200, 300, 200,NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
    hdialog = CreateDialog(

    hInstance, // handle to application instance
    MAKEINTRESOURCE(IDD_DIALOG1), // identifies dialog box template name
    hwnd, // handle to owner window
    NULL, // pointer to dialog box procedure
    );
    ShowWindow(hdialog, SW_SHOW);

    // üçüncü adım: mesajların alınması ve ayrılması

    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
    }
    return Msg.wParam;

    }


    Arkadaşlar bu kod ile bir dialog kutusu yapabiliyorum.Fakat LRESULT CALLBACK fonksiyonu altında dialog penceresini gizleyemiyorum ve de dialog penceresindeki tuşlara basılınca işlem yapamıyorum.
    Acaba ne yapmam gerek?

    (Kodlar visual c++ 6.0'da yazıldı)




  • hdialog = CreateDialog(
    hInstance, // handle to application instance
    MAKEINTRESOURCE(IDD_DIALOG1), // identifies dialog box template name
    hwnd, // handle to owner window
    NULL, // pointer to dialog box procedure
    );

    Eğer diologbox açılıyor fakat hiçbirşeye cevap vermiyorsa sorun yukarıda verdiğim koddaki CreateDialog API'sinin son parametresinden kaynaklanıyor.Bu CreateDialog API'sinin son parametresi DLGPROC yapısında bir fonksiyonun adresini alır.Bu da DialogBox penceresinin CALLBACK fonksiyonunun(pencere fonksiyonu) adresi olmalı.Burada verdiğin kodlarda bu fonksiyon BOOL CALLBACK DialogFunc() ... fonksiyonu.Ama sen CreateDialog'da bu paramtreyi NULL geçmişsin.Bu paramtreye BOOL CALLBACK DialogFunc()'ın adresini vereceksin.

    Bu arada buraya bizden başka kimse girmiyor çünkü subsystem seven pek yok galiba.Birkaç kişi var aslında onlar kendilerini biliyorlar



    < Bu mesaj bu kişi tarafından değiştirildi PanDa -- 15 Aralık 2007; 16:15:22 >




  • Yapay Zeka’dan İlgili Konular
    Oyunları C veya D ye Kurmak
    14 yıl önce açıldı
    Daha Fazla Göster
  • Hızır gibi yetştin hocam.
    Orda ne demek istediğini anlamayınca boş geçim dediydimŞimdi çalıştı sağolasın.
    Artık edit kutusuna yazılan yazıyı kontrol ederek istediğim kelimeler yazıldığında renk değiştirmesini sağlarsam gerçek bir program yazmaya başlayacam inşallah.
  • ya arkadaşlar c++ da ben sadece dos ortamındaki gibi program yazıyorum.Böyle pencerelir butonları edit kutularınnı nasıl yapıyoz
  • quote:

    Orjinalden alıntı: disdanger

    ya arkadaşlar c++ da ben sadece dos ortamındaki gibi program yazıyorum.Böyle pencerelir butonları edit kutularınnı nasıl yapıyoz


    Hocam senin derdini en iyi ben anlarım.
    Msn'ye fazla girmem ama sen gene de ekle sana msn'den ne yapman gerektiğini anlatim.
    Adresi sana özelden atacam.
  • Hocam sayende bayağa bir ilerledim.Sonunda programı yazmaya başladım.
    Herzaman ki gibi ufak bir problem var.
    Şimdi ben listbox ve combobox oluşturuyorum ama ne listboxtaki ne de comboboxtaki ifadeler resimli olmuyor.Acaba bunun için ne yapmam gerekir?
    Not:
    Sorunu tam olarak anlamak için
    http://rapid-share.com/files/76928148/resimler.zip.html
    adresinden indirdiğiniz 2 resmi karşılaştırınız
  • Windows'un içinde tanımlı kontrol sınıflarının haricinde programcılar kendi kontrollerinide geliştirebilirler.Resim - 2'de gösterdiğin açılık kutular da böyle birşey.Bu gibi resimli kutular .NET ortamında herhangi bir dil ile ve VS2005'in sunduğu olanaklar ile çok kolay oluşturulur ama API'ler ve C ile bunun gibi bir kontrol geliştirmek yeni başlayan biri için haftalar sürebilir @strom.Açıkçası nasıl yapıldığını açıklayacak kadar uzun vaktim yok bu konuda

    Fakat bunun için user32.dll'de tanımlı resim işleme ile ilgili API'leri incelemeni ve windows mesaj yönetimini de bir nebze daha fazla araştırmanı tavsiye ederim.Kontrollerin DC numaraları elde edildikten sonra, ayrıca ekleyeceğin iconunda marge oranlarınıda hesapladıktan sonra istediğin kontrole istedeğin iconu çizdirebilirsin.Ayrıca forum gizlendiğinde veya başka forumun altına geçtiğinde bu image'lerin tekrar çizilmesi için forumun veya controlün WM_PAINT mesajlarını yakalayıp burda yaptığın işlemleri tekrarlaman gerekir.




  • quote:

    Orjinalden alıntı: PanDa

    Windows'un içinde tanımlı kontrol sınıflarının haricinde programcılar kendi kontrollerinide geliştirebilirler.Resim - 2'de gösterdiğin açılık kutular da böyle birşey.Bu gibi resimli kutular .NET ortamında herhangi bir dil ile ve VS2005'in sunduğu olanaklar ile çok kolay oluşturulur ama API'ler ve C ile bunun gibi bir kontrol geliştirmek yeni başlayan biri için haftalar sürebilir @strom.Açıkçası nasıl yapıldığını açıklayacak kadar uzun vaktim yok bu konuda

    Fakat bunun için user32.dll'de tanımlı resim işleme ile ilgili API'leri incelemeni ve windows mesaj yönetimini de bir nebze daha fazla araştırmanı tavsiye ederim.Kontrollerin DC numaraları elde edildikten sonra, ayrıca ekleyeceğin iconunda marge oranlarınıda hesapladıktan sonra istediğin kontrole istedeğin iconu çizdirebilirsin.Ayrıca forum gizlendiğinde veya başka forumun altına geçtiğinde bu image'lerin tekrar çizilmesi için forumun veya controlün WM_PAINT mesajlarını yakalayıp burda yaptığın işlemleri tekrarlaman gerekir.

    Cevabın için çok teşekkürler hocam.
    Nasıl yapılacağını zaten anlatmana gerek yok.Yolunu söylemen kafiydi sende söyledin sağolasın.
    Bu farkın niçin oluştuğunu merak ediyordum zaten.
    Kendi kontrollerimi geliştirmeyi bir araştıracam.
    Sağolasın




  • Arkadaşlar oluşturduğumuz bir dialog kutusunun ana pencre hareket ettiğinde hareket etmesini ve oluşması gereken koordinatları nasıl belirleriz?

    (Mesela yukarıdaki yazmış olduğum koddaki dialog kutusunun)
  • Bi de arkadaşlar visual c++'da başka bir programın exe'sini nasıl çalıştırabilirim?
    Mesela kendi yazdığım bir programda bir tuşa bastığımda programı yazarken belirttiğim adresteki (ismini de belirttiğim) exe dosyasını nasıl çalıştırabilirim?
  • @strom ilk sorun imkansız.Çünkü Dialog pencereleri (MessageBox, InputBox vb.) açıldığında owner pencere thread'ini bloke eder.Yani daha açık söylemek gerekirse dialog penceresinin açıldığı noktada program akışı durur, dialog penceresi kapandığında dönen result'a göre devam eder.

    İkinci soruna gelince.Bu işi yine CreateProcess API fonksiyonu ile yapabilirsin.Bu API yolunu verdiğin çalıştırılabilir dosyayı alır ve bir process oluşturur.

    Örneğin;

    void main( void ) {
    STARTUPINFO startup { sizeof(STARTUPINFO) };
    PROCESS_INFORMATION procInfo;
    char[] argumanlar "notepad.exe C:\\deneme.txt";

    if(!CreateProcess(NULL, argumanlar, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &procInfo)) {
    //Process oluşturulamadı..Buraya hata kodlarını yazarsın
    }
    //Burdaki API kernel nesneleri kapalı duruma gelene kadar, çağrıldığı thread'i bloke eder
    //Yani biz açtığımız process'in kapanmasını bekliyoruz(notepad.exe)
    WaitForSingleObject(procInfo.hProcess, INFINITE);
    puts("Program sonlandi..\n\r");
    }

    CreateProcess'te bazı önemli noktalar var.Mesela bu API'nin ilk paramtresi çalıştırılmak istenen exe'nin yolunu,
    ikinci parametre ise komut satırı argümanlarını alır.Bu komut satırı argümanları STARTUP kodu tarafından ayrıştırılır argc, argv argümanları olarak main'e geçirilir falan filan...
    Şimdi sen istersen program ismini ilk paramtreye, argümanları ikinci paramtreye verebilirsin.Fakat ilk paramtre NULL geçilmeyecekse çalıştırılacak programın yolu göreli değil ("deneme.exe" gibi) tam yolu olmalıdır.Eğer göreli olacaksa da bu program sadece ana process'in çalışma dizininde aranır..
    Ama bu paramtre NULL geçilip ikinci parametre "ilk eleman mutlaka program ismi, diğerleri boşluklarla ayrılmış argümanlar" olacak şekilde geçirilirse, program ismi göreli olabilir.("deneme.exe" gibi)Bu durumda bu program CreateProcess'i çağıran programın çalışma ve bulunduğu dizinde, sistem32 dizininde(NT'de) ve çevre değişkenlerinde aranır.Bu daha esnektir, o yüzden bunu kullan.Diğer parametreler ile kafanı karıştırmıyorum.Lazım olunca onlarada bakarız...

    Kolay gelsin.




  • quote:

    Orjinalden alıntı: PanDa

    @strom ilk sorun imkansız.Çünkü Dialog pencereleri (MessageBox, InputBox vb.) açıldığında owner pencere thread'ini bloke eder.Yani daha açık söylemek gerekirse dialog penceresinin açıldığı noktada program akışı durur, dialog penceresi kapandığında dönen result'a göre devam eder.

    İkinci soruna gelince.Bu işi yine CreateProcess API fonksiyonu ile yapabilirsin.Bu API yolunu verdiğin çalıştırılabilir dosyayı alır ve bir process oluşturur.

    Örneğin;

    void main( void ) {
    STARTUPINFO startup { sizeof(STARTUPINFO) };
    PROCESS_INFORMATION procInfo;
    char[] argumanlar "notepad.exe C:\\deneme.txt";

    if(!CreateProcess(NULL, argumanlar, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &procInfo)) {
    //Process oluşturulamadı..Buraya hata kodlarını yazarsın
    }
    //Burdaki API kernel nesneleri kapalı duruma gelene kadar, çağrıldığı thread'i bloke eder
    //Yani biz açtığımız process'in kapanmasını bekliyoruz(notepad.exe)
    WaitForSingleObject(procInfo.hProcess, INFINITE);
    puts("Program sonlandi..\n\r");
    }

    CreateProcess'te bazı önemli noktalar var.Mesela bu API'nin ilk paramtresi çalıştırılmak istenen exe'nin yolunu,
    ikinci parametre ise komut satırı argümanlarını alır.Bu komut satırı argümanları STARTUP kodu tarafından ayrıştırılır argc, argv argümanları olarak main'e geçirilir falan filan...
    Şimdi sen istersen program ismini ilk paramtreye, argümanları ikinci paramtreye verebilirsin.Fakat ilk paramtre NULL geçilmeyecekse çalıştırılacak programın yolu göreli değil ("deneme.exe" gibi) tam yolu olmalıdır.Eğer göreli olacaksa da bu program sadece ana process'in çalışma dizininde aranır..
    Ama bu paramtre NULL geçilip ikinci parametre "ilk eleman mutlaka program ismi, diğerleri boşluklarla ayrılmış argümanlar" olacak şekilde geçirilirse, program ismi göreli olabilir.("deneme.exe" gibi)Bu durumda bu program CreateProcess'i çağıran programın çalışma ve bulunduğu dizinde, sistem32 dizininde(NT'de) ve çevre değişkenlerinde aranır.Bu daha esnektir, o yüzden bunu kullan.Diğer parametreler ile kafanı karıştırmıyorum.Lazım olunca onlarada bakarız...

    Kolay gelsin.




    Hocam çok sağol.Geçte olsa EXE'yi çalıştırmayı başardım.
    Birde aklıma takıldı.Acaba programlarda OPEN tuşuna bastığımızda karşımıza çıkan pencere CreatePrcosses mantığına göre mi çalışıyor???



    < Bu mesaj bu kişi tarafından değiştirildi strom -- 26 Şubat 2008; 22:37:32 >




  • Panda hocam sana birkaç sorum olacak:

    1-Mesela MPLAB , PROTON , C ... gibi derleyiciler yazılan programı ASM koduna çevirdikten sonra MPSAM programını çalıştırıp , çevirdikleri ASM kodunu MPSAM programına parametre olarak veriyorlar ya.Bunu nasıl yapıyorlar?
    Başka bir programı nasıl kontrol ediyorlar?

    2-Oluşturduğumuz bir pencereyi nasıl sürekli görünür kalmasını sağlayabiliriz?
    Yani sürekli bütün pencerlerin üstünde olacak.

    3-Bazı programlarda pencere stilleri çok farklı.Mesela oluşturulan ana pencere kare değilde yuvarlak , tepesinde mavi kısım yok.Bunu nasıl beceriyorlar.
    C++ 'da CreateWindow fonksiyonunu kullanarak yapamayız herhalde.
    Acaba bunu yapmak için internette hangi anahtar kelimlerle arama yapmam lazım?

    4-Programımızın QuickLanch bölümünde olmasını nasıl sağlarız?

    5-Son olarak hocam mesela elimizde .str uzantılı bir dosya var.Yazdığımız programımızı yüklediğimizde artık bilgisayarda .str uzantılı dosyaların belirlediğimiz ikonlar şeklinde göstermesini nasıl sağlarız?
    Hangi system klasörüne müdehale etmeliyiz?

    Hocam soruları açıklamasan bile en azından hangi anahtar kelimlerle aramam gerektiğini söyle.
    Yardımlarını beliyorum hocam.
    Kendine iyi bak...




  • PanDa Helal olsun kardeşimize çok yardımcı olmuşsun valla ne diyim
  • Azminize hayran kaldım ama bence zor bir paltformdan geliştirmeye başlamışsın C# ile daha kısa sürede daha iyi programlar geliştrebilirsin. Aynı zamanda C++ kadar da güçlü ve esnek.
  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.