მთავარი  |    ფორუმი  |    FAQ  |    წესები  |    რეკლამა ჩვენთან  |    კონტაქტი  |    რუქა






ადგილმდებარეობა  მთავარი » სტატიები » პროგრამირება
დავთესოთ ერთხელ, მოვიმკათ მრავალჯერ

ნიადაგი

    კომპინფოს ერთერთ ნომერში ჩვენ შევეხეთ ვინდოუს-კონტროლებზე შრიფტის და ფანჯრის ფერის დაყენების საკითხს ოღონდ იქ მოყვანილი იყო ძირითადი მომენტები ანუ ის თუ როგორ შეიძლება საერთოდ განხორცილელებულიყო ეს სისტემა MFC, WinAPI ტიპის პროექტებში, შესაბამისად კოდის დონეზეც მისი გაკეთება წარმოადგენდა საკმაოდ დამღლელ პროცესს გამოუცდელი პროგრამერისათვის და არა მარტო მათთვის, რადგან იმ შემთხვევაშიც კი როდესაც წინასწარ მზად გვაქვს ყველა მახასიათებელი პარამეტრი, სტრუქტურა თუ ცვლადი და ყოველ ახალ პროექტში ვახდენთ მათ უბრალო კოპირებას, თითოეული ვინდოუს-კონტროლისათვის თუნდაც ორი-სამი საკუთარი პარამეტრის და ფუნქციის ბლოკის შექმნა საკმაოდ მოუხერხებელია.
    ახლა კი ჩვენი ბიოლოგიური პროცესორის მიერ ერთი, აუცილებლად შესასრულებელი ალგორითმუკა:

   while( (აღარ_გახსოვთ_ის_სტატია) ან (არ_იცით_რაზეა_ლაპარაკი) )
   {
       გადაიკითხეთ_ Compinfo21_ შესაბამისი_სტატია();
   }

    მოკლედ, რა ხდება: თუ უკვე შეასრულეთ ზემოთ მოყვანილი პროცედურა მაშინ მინდა მოგახსენოთ რომ ამჯერად საქმეს მივიყვანთ იქამდე, რომ ყოველი ახალი პროექტის შექმნისას ვინდოუს-კონტროლის გრაფიკული მახასიათებლების შესაცვლელად პროექტის ძირითად ფაილებში, მხოლოდ და მხოლოდ დაგვჭირდება ასეთი სახის კონსტრუქცია, მაგ:

m_Static1.SetColor( color1, color2, color3 );

    და საქმეც დამთავრებულია !

    აქ
    color1 – ფონის ფერია;
    color2 – ტექსტის ფონის ფერი;
    color3 – ტექსტის ფერი;
    თითოეული მათგანი წარმოადგენს RGB ფუნქციას;

    ნუ, ახლა მთლად ასეც არ არის, რომ დედიშობილა პროექტში ავკრიფოთ ეს ელეგანტური კონსტრუქცია და ყველაფერი თავისით გაკეთდეს, ცხადია ამისათვის ჩვენც რაღაც მსხვერპლი უნდა გავიღოთ, მაგრამ გაგახარებთ და გეტყვით, რომ მისი გაღება მოგიხდებათ ცხოვრებაში მხოლოდ ერთხელ, მერე კი იმკით და იმკით მიღებულ მოსავალს;
აი ასეთი თვისება აქვთ ბიბლიოთეკებს !

    მიხვდით ალბათ რომ ლაპარაკია გარკვეული კოდის h და cpp ფაილებში განთავსებაზე. ახლა, რა კოდია ეს ?

რა კოდია ეს !

    თუ ცოტათი მაინც გამოცდილი პროგრამერი ბრძანდებით ალბათ ერთხელ მაინც შეგიქმნიათ საკუთარი ფუნქცია და განგითავსებიათ საკუთარსავე ბიბლიოთეკაში.
თუ არა, მაშიან მომყევით !

    შევქმნათ უბრალოდ MFC ტიპის “დიალოგ-ბეიზდ” პროექტი, ყოველგვარი ზედმეტი კომპონენტებით გადატვირთვის გარეშე, როგორიცაა “აქტივიქსები”, “ებაუთები” და ასე შემდეგ, თუმცა არც ისინი დაგვიშავებენ რამეს. პროექტის სახელი იყოს TestColors.

იმედია ვიზარდ-კლასთუხუცეს-მაიკროსოFტელთან ურთიერთობის ამბავში უკვე საკმაოდ დაოსტატდით.

    როგორც ამ ტიპის პროექტებს სჩვევიათ, დეFოლტად დაჯდება ორიოდე ღილაკი და ერთიც სტატიკ-კონტროლი. დავტოვოთ თითოეული მათგანი ხელუხლებელი, ოღონდ სტატიკის იდენტიფიკატორი IDC_STATIC შევცვალოთ IDC_STATIC1-ით. შემდეგ მივყვეთ მენიუს: Project --> Add class. . . ამოვირჩიოთ პუნქტი Generic C++ Class და დავაყენოთ პარამეტრები შემდეგი სახით

Image at : www.g3b.ge

მე ვიყენებ სტუდიოს 7.0 ვერსიას, თუ თქვენ გაქვთ უფრო ადრეული ან უფრო გვიანეული ვერსია მაშინ ალბათ გასაგებია რომ აქ არასტანდარტული არაფერი კეთდება და იგივეს გაკეთება თქვენს კომპილატორში არ გაგიჭირდებათ, იმ შემთხვევაშიც კი თუ ინტერფეისი ცოტათი განსხვავებულია.

    მოკლედ, პროექტში შეიქმნება კლასი სახელად CMyStatic, რომელიც არის CStatic-ის მემკვიდრე-შვილობილი.
გავხსნათ mystatic.h ფაილი და იქ არსებული კოდი შევცვალოთ შემდეგნაირად:

#pragma once
include "afxwin.h"
class CMyStatic:public CStatic
{
  private:
  COLORREF Text_bkColor;
  COLORREF Text_Color;
  COLORREF Ground_Color;
  private:
  CBrush Brush;
  public:
  CMyStatic();
  public:
  void SetColor(COLORREF _ground,COLORREF _text_ground,COLORREF _text);
  virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult);
};

  ხოლო mystatic.cpp ფაილში კი შემდეგნაირად:

#include "StdAfx.h"
#include ".\mystatic.h"

CMyStatic::CMyStatic()
{
	Ground_Color=GetSysColor(COLOR_3DFACE);
	Text_bkColor=GetSysColor(COLOR_3DFACE);
	Text_Color  =RGB(1,1,1);
}

void CMyStatic::SetColor(COLORREF _ground,COLORREF _text_ground,COLORREF _text)
{
	Text_bkColor=_text_ground;
	Text_Color=_text;
	Ground_Color=_ground;
	RedrawWindow();
}
BOOL CMyStatic::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{
	if (message != WM_CTLCOLORSTATIC)
	{
	 return CStatic::OnChildNotify(message, wParam, lParam, pLResult);
	}
		HDC hdcChild = (HDC)wParam;
		SetTextColor(hdcChild, Text_Color);
		SetBkColor(hdcChild, Text_bkColor);
		Brush.DeleteObject();
		Brush.CreateSolidBrush(Ground_Color);
		*pLResult = (LRESULT)(Brush.GetSafeHandle());
	return true;	
}
     

      ყოველ შემთხვევაში მიაკომპილეთ და გაუშვით რათა წინასწარ აღვკვეთოთ ყოველგვარი პარაზიტული შეცდომები.
ახლა გადავიდეთ დიალოგურ ფანჯარაზე და ჩვენს ნაცნობ სტატიკ-კონტროლს დავამატოთ ცვლადი სახელად m_Static1, ოღონდ მისი ტიპი უნდა იყოს არა CStatic არამედ CMyStatic. ანუ სტანდარტული MFC კლასის შვილობილი კლასი, რომელიც წარმოებულია მისგან public სპეციფიკატორით

Image at : www.g3b.ge

შევქმნათ ფანჯარაზე ღილაკი სახელად “Set Color” და დავაორმაგწკაპუნოთ, შეიქმნება შესაბამისი ფუნქცია-მეთოდი. ჩავწეროთ მასში შემდეგი კოდი:

m_Static1.SetColor( RGB(255,0,0) , RGB(255,0,0) , RGB(0,0,255) );

    მივაკომპილოთ და გავუშვათ; დააჭირეთ Set Color ღილაკს და თუ ყველაფერი სწორედ გააკეთეთ, თქვენთითონ ნახავთ იმ მშვენიერ შედეგს რისთვისაც ამდენი ვიშრომეთ. :-)
ძალიან კარგი !

    ასე რომ ყოველი ახალი პროექტის შექმნისას საჭიროა, მხოლოდ პროექტში ჩართოთ თქვენი h-cpp ბიბლიოთეკა და შესაბამისი ცვლადის ტიპად არჩიოთ არა სტანდარტული MFC კლასი, არამედ თქვენს მიერ შექმნილი შვილობილი კლასი. ცხადია, იგივე შეიძლება გაკეთდეს ედით-ბოქსისათვისაც. ეს უკვე თქვენთვის მომინდვია. რაღა თქმა უნდა საორგანიზაციო საკითხებიც ბიბლიოთეკებთან დაკავშირებით თქვენი გადასაწყვეტია. 

. . . არა, მაინც რა უცნაური ვინმეა ეს Microsoft-ი . . .

    აი, სულ ეს იყო . . .

რეზიუმე

"ის ურჩევნია მამულსა . . . "

 

ავტორი : გიორგი ბაწაშვილი (G3B)

  
ინფორმაცია


თემატური სტატიები




ბმულები შესაბამის თემაზე


სტატიის შეფასება
ეს გვერდი უკვე შეაფასეს!

შეფასება: 1
შეფასება: 2



გამოხმაურება

მიყვარხარ ვიღაც ხარ! :D:D
12-02-2010, 19:06:53 | Dixtosa

აღდგენილია სტატიის საწყისი ვარიანტი
07-02-2010, 14:23:50 | G3B


კომენტარის დატოვება
თქვენ არ შეგიძლიათ კომენტარების დატოვება.