Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
27
Cevap
15078
Tıklama
0
Öne Çıkarma
c++ ile windows programları yapmak
S
18 yıl
Binbaşı
Konu Sahibi

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)



P
18 yıl
Yüzbaşı

@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


Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

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 >
Bu mesaja 1 cevap geldi.
P
18 yıl
Yüzbaşı

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...


Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

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)


Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

#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ı)


Bu mesaja 1 cevap geldi.
P
18 yıl
Yüzbaşı

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 >
Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.
D
18 yıl
Binbaşı

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


Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

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.



S
18 yıl
Binbaşı
Konu Sahibi

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


Bu mesaja 1 cevap geldi.
P
18 yıl
Yüzbaşı

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.


Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

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


Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

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)


Bu mesaja 1 cevap geldi.
S
18 yıl
Binbaşı
Konu Sahibi

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?


Bu mesaja 1 cevap geldi.
P
18 yıl
Yüzbaşı

@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.


Bu mesaja 2 cevap geldi.
S
17 yıl
Binbaşı
Konu Sahibi

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 >
Bu mesaja 1 cevap geldi.
S
17 yıl
Binbaşı
Konu Sahibi

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...


Bu mesaja 1 cevap geldi.
B
17 yıl
Teğmen

PanDa Helal olsun kardeşimize çok yardımcı olmuşsun valla ne diyim


Bu mesaja 1 cevap geldi.
D
17 yıl
Onbaşı

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.


Bu mesaja 1 cevap geldi.