2011-09-14 17 views
5

Windows'ta, her kontrol için (her iletişim kutusu, pencere, metin kutusu ve onay kutusu vb. Için) bir kontrol kimliği verilecektir.Windows GUI kontrol kimlikleri nasıl oluşturulur?

Bu denetim kimliği nasıl oluşturulur? Windows'daki iki uygulama aynı kontrol kimliğine sahip olabilir mi? Windows denetim kimliklerini el ile ayarlamanın bir yolu var mı?

+0

Bu doğru mu? Kontrollerin kimlikleri kullanmayı seçip seçemeyeceğini düşünüyorum. Bir denetimi tanımlamak için bir pencere kolu yeterlidir. –

+1

Değil. Normalde sadece bir diyalog şablonundan oluşturulan diyaloglar için ayarlanır. SetWindowLongPtr, GWLP_ID ile daha sonra değiştirilebilir. –

+0

Birden çok kontrol kimliği tipi vardır. Otomasyon kimliği ayarlamak istediğiniz şeydir. Uygulamanız için WinForms, WPF veya Win32 kullanıyor musunuz? Her çerçeve için farklı olacak "windows kontrol kimlikleri elle ayarlamak için herhangi bir yolu var" cevabı.Ve otomasyon kimlikleri global olarak benzersiz olmak zorunda değildir - sadece belirli bir kapsamda benzersiz olmak zorundadırlar, çünkü belirli bir kontrolü tanımlamak için ağaçtan aşağı doğru benzersiz bir yola ihtiyacınız vardır. Net GUI uygulamaları için bunu bakın: http://msdn.microsoft.com/en-us/library/aa349646.aspx –

cevap

5

Denetim Kimliği CreateWindow işlevine iletilen parametrelerden biridir. Denetim bir iletişim kutusundan oluşturulduysa, iletişim yöneticisi iletişim kimliğini iletişim şablonundan alır. İki kontrolün aynı kimliğe sahip olması oldukça yaygındır. Örneğin, çoğu Cancel düğmesinde denetim kimliği IDCANCEL olacaktır. Raymond yazdıklarını ek olarak

+0

Hangi parametreyi göremiyorum CreateWindow denetim kimliğidir. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx – Erik

+0

Ah, bulundu. Sen hMenu kullanıyorsun. Bu sayfada bulundu: açıklamalar bölümünde http://msdn.microsoft.com/en-us/library/windows/desktop/ms645478(v=vs.85).aspx. – Erik

+0

Aynı pencerede aynı kimliğe sahip iki kontrol için ** ** nadirdir **. Örneğin, [GetDlgItem işlevi] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645481 (v = vs.85) .aspx) buna bağlıdır. – user34660

4

:

bir pencere (kontroller aka) alt pencereleri oluşturmak ve onlara aynı ControlID vermek için Tamamen yasal. Tek sorun, bir denetim kimliğini (GetDlgItem() kullanarak) benzersiz bir şekilde alabilmenizdir. Bir denetimin çalışma zamanında (statik etiket gibi) işlenmesini istemiyorsanız, benzersiz bir kontrol kimliği vermeniz gerekmez. Sadece 0xFFFF verin).

Bir farklı uygulama veya üst pencereler (düğmeleri için örneğin IDCANCEL veya IDOK) içinde farklı kontroller/çocuk pencereler için aynı kontrol kimliği kesinlikle yasal (ve her zamanki) bulunuyor. GetDlgItem(), belirli bir üst pencerenin denetimini alır. diğer yanıtlar bilgilere ek olarak

3

:

her biri için pencerelerinde ve benzeri her kontrolün bir kontrol kimliği verilecektir (her iletişim, pencere, metin ve onay kutusunu vb)

Bu aslında tam olarak doğru değil: Uygulama pencereleri ve iletişim kutuları gibi üst düzey pencereler aslında hiçbir kontrol kimliğine sahip değil. Sadece çocuk pencereleri kontrol kimliğine sahip olabilir.

(Üst düzey pencereleri CreateWindow parametre yerine pencere için hMenu belirtmek için kullanabilirsiniz - bu yüzden yalnızca üst düzey pencere menubars olabilir.) Gerçekten uygulama geliştiricisi kadar atamak nasıl yapılacağına karar vermek oluyor

ve kimlikleri kullanın. Genellikle, bir HWND ile bir HWND'ye sahip olan GetDlgItem() ile kullanılırlar, bu nedenle bu kimliklerin yalnızca bu ebeveynin içinde benzersiz olması gerekir. Bir geliştiricinin çalışma zamanında bir denetim araması yapması gerekmiyorsa, ona herhangi bir kimlik verebilir, geleneksel olarak -1 burada kullanılabilir.

Bazı çerçeveler, kontrol kimliklerini hiç kullanmaz ve HWND'leri oluşturuldukları şekilde takip etmelidir.

+0

WinSpy ++ kullanma calc.exe için en üst düzey pencereye baktım ve bir kontrol kimliğine sahip. Üst pencere, üst pencere kimliği "00000000" olduğu için biliyorum. – Sabuncu

+0

Bu değer muhtemelen pencerenin menü tutamağıdır; Pencerelerin üst düzey veya alt pencereleri olup olmadıklarına bağlı olarak bir menü işleyicisi veya bir kontrol kimliği vardır. Microsoft'un Spy ++ aracı, bu değeri görüntülemek için Pencere Özellikleri iletişim kutusundaki aynı satırı kullanır; varsayılan olarak "Denetim Kimliği" etiketini kullanarak, pencere üst düzeydeyse ve "değer" ise "Menü Kolu" olarak değiştirir. boş olmayan. Muhtemelen WinSpy ++ buradaki etiketlerin kullanımında gayretli davranmıyor. – BrendanMcK

+0

Yanıt için teşekkürler. Ancak, söz konusu Kontrol Kimliğini 'GetDlgItem()' e iletebiliyorum ve karşılığında anlamlı bir kazanç elde edebiliyorum. GetDlgItem(), veri öğesini geçerli bir Kontrol Kimliği olarak onayladığında, bunun bir olması gerektiğini düşünüyorum. – Sabuncu

0

diğer cevaplara ek olarak: denetimin kimliği aynı olmasına rağmen

, daha iyi benzersiz yapmak istiyorum. Denetimleri, kimlikleri ve hwnd'si ile üst pencerelerine raporlar. Ebeveynin mesaj döngüsünde genellikle denetimi tanımlamak için kimliği kullanırız, bu durumda farklı olayların ele alınmasını istiyorsanız, her kontrol için farklı kimlik kullanın.