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






ადგილმდებარეობა  მთავარი » სტატიები » პროგრამირება
ვნახოთ რას გვირჩევს MSDN-ი, როცა გვაქვს კომპი, C და დ-ენ-ი!

ყოველგვარი შესავლის გარეშე . . . ჩვენი მიზანია, რომ ღილაკზე დავსვათ bitmap-სურათი, MSVC++ -ის IDE-ში, დიალოგურ ფანჯარაზე.

   მააშ. . .დავიწყოთ.

   შევქმნათ დიალოგური ფანჯარა. კომფიგურაცია იყოს ჩვეულებრივი, ყოველგვარი ქსელებისა და აქტივების გარეშე. დავსვათ მასზე ორი ღილაკი და შესაბამისად დავაწეროთ სახელები First და Next. ოღონდ აქსელერატორუნარიანობისათვის ორივეს სახელს წინიდან მივუწეროთ & სიმბოლო - "&First" და "&Next".

   აი ისიც:

Image at : www.g3b.ge

   ხო, დიდი არაფერია . . .

   მაშინ, განვაგრძოთ.

    ახლა, იმისათვის რომ მთლად უსაქმური პროგრამა არ გამოგვივიდეს დავამატოთ თითოეულ ამ ღილაკს თავისი ფუნქციონლუობა, მაგალითად, დაწკაპუნებისას გამოგვიტანოს MessageBox(" ") ფანჯარა, შესაბამისი სახელებით First და Next.

    შემდეგ.

    შევქმნათ მეორე Next ღილაკის შესაბამისი ცვლადი სახელით "m_Button2". გავიხსენოთ, რომ VC++ 7 ვერსიაში ცვლადის შექმნა ხდება პირდაპირ Pop-Up მენიუდან Add Variable პუნქტის ამორჩევით, ხოლო რაც შეეხება VC++ 6 ვერსიას იქ ეს შესაძლებელია Wizard-ის საშუალებით, იგივე Pop-Up მენიუდან.

Image at : www.g3b.ge

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

BOOL CTestBitmapDlg::OnInitDialog()

{

      CDialog::OnInitDialog();

      . . . . . . . . . . . . . . . . . . . . .

      SetIcon(m_hIcon, TRUE); // Set big icon

      SetIcon(m_hIcon, FALSE); // Set small icon

      // TODO: Add extra initialization here

      აი აქ !

      return TRUE; // return TRUE unless you set the focus to a control.

} .

    მაგრამ ჯერ საჭიროა რომ მოვახდინოთ სასურველი ნახატის პროექტის რესურსებში ჩამოტვირთვა, ( თუმცა ეს არ არის აუცილებელი იგივე ამოცანის სხვა გზით გადაწყვეტისას).

   მე მაგალითად, გავაკეთე ასეთი სახელდახელო ნახატი:

Image at : www.g3b.ge

    ამ ფაილის სახელია next.bmp.

    აქვე ერთი პატარა სეკრეტუნა: თუ მაინცდა მაინც რაიმე ეგზოტიკური ნახატები არა გაქვთ, უკეთესია რომ მათი შესაბამის ფაილები იყოს 16 Color Bitmap და არა 24 Color Bitmap ფორმატის, ეს მნიშვნელოვნად დაზოგავს თქვენი exe ფაილის ზომას.

   განვაგრძოთ.

   პროექტში რესურსის ჩამოტვირთვა ხდება სტანდარტული მეთოდით: Project --> Add Resource --> Import --> და თქვენი ფაილი. შედეგად bmp ფაილი აღმოჩნდება პროექტში და მას მიენიჭება იდენტიფიკატორი IDB_BITMAP1. ყოველ შემთხვევაში ჩემთან ასეა.

   სხვათაშორის პროექტის რესურსებში რაიმე ფაილის ჩამოტვირთვა საკმაოდ დიდ შესაძლებლობებს იძლევა. ეს რაიმე ფაილი შეიძლება იყო ActiveX და თქვენ წარმოიდგინეთ exe ფაილიც კი. ეს ფაქტიურად იმას ნიშნავს, რომ ერთმა ძირითადმა exe ფაილმა საჭიროების შემთხვევაში შეიძლება "შვას" თავისი დამხმარე ფაილები. დაახლოებით ასეა მოწყობილი საინსტალაციო ფაილები.

    ახლა ისღა დაგვჩენია, რომ შევუდგეთ ჩვენი ძირითად მიზნის განხორციელებას. პირველი რაც შეიძლება გავაკეთოთ მის მისაღწევად ეს არის ის რომ გამოვიყენოთ თანამედროვე კომპილატორების რედაქტორთა მდიდარი შესაძლებლობები და m_Button2 ცვლადის შემდეგ დავსვათ წერტილი. თუ შესაბამისი რეჟიმი ჩართულია მაშინ წესით და რიგით უნდა ჩამოიშალოს CButton კლასის ველები, მეთოდები, ფუნქციები და რა გინდა სულო და გულო.

   მოვძებნოთ იქ მეთოდი ასეთ სახელით SetBitmap. ამოვირჩიოთ, გავხსნათ ფრჩხილი და . . .

   აღმოვაჩენთ, რომ იგი საჭიროებს ე. წ. HBITMAP ტიპის რაღაც ცვლადს - შენ რომ ჩემთვის HBITMAP ტიპის ცვლადი არ მოგიტანიაო - გვითხრა SetBitmap-მა და ჩვენც გავეშურეთ MSDN- ისაკენ. ბევრი ვეძებეთ თუ ცოტა ვეძებეთ აღმოვაჩინეთ, რომ ამ ტიპს აბრუნებს ასეთი ფუნქცია LoadBitmap. აი მისი პროტოტიპი:

HBITMAP LoadBitmap(

      HINSTANCE hInstance, // handle to application instance

      LPCTSTR lpBitmapName // name of bitmap resource

);

    პირველი პარამეტრი არის მაჩვენებელი იმ მოდულის ინსტანციაზე რომლის შესრულებადი ფაილიც შეიცავს საჭირო რესურსს. ამ პარამეტრს აბრუნებს MFC-ის ბიბლიოთეკის გლობალურ ფუნქციათაგან AFX კატეგორიის ერთ- ერთი ფუნქცია, ეს არის:

    HINSTANCE AFXAPI AfxGetInstanceHandle( );

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

    LPTSTR MAKEINTRESOURCE( WORD wInteger );

    მაშ საბოლოოდ მთლიან პროცედურას ექნება ასეთი ტანი:

SetBitmap

(

      ::LoadBitmap

      (

      ::AfxGetInstanceHandle(),

      MAKEINTRESOURCE( _resource_id )

      )

);

    აქ, _resource_id  რესურსის იდენტიფიკატორია. ხოლო სახელთა სივრცის სპეციფიკატორები (::) კი მიუთითებენ იმაზე რომ ფუნქციები აღებული არა კლასებიდან არამედ გლობალური სივრციდან ( იხ. "namespace" C++-ში).

    და დაგვრჩა კიდევ ერთი ნაბიჯი.

   კერძოდ, იმ ღილაკის თვისებებში რომელზედაც ვაყენებთ ბიტმეფს, პარამეტრი Bitmap-ის მნიშვნელობა false უნდა შევცვალოთ true-თი. ვნახავთ რომ წარწერა ღილაკზე გაქრება, მაგრამ ეს იმას არ ნიშნავს რომ კომპილაციისა და გაშვების შემდეგ მისი შესაბამისი აქსელერატორი აღარ იმუშავებს.

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

    ასეთია Microsoft-ი, გაუგებ რამეს?

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

რეზიუმე

Windows-ზე რომ დასვათ Bitmapi-ი,

საკმარისია MS WinAPI - ი!

Image at : www.g3b.ge

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

  
ინფორმაცია


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




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

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



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

აღდგენილია სტატიის საწყისი ვარიანტი
07-02-2010, 12:46:57 | G3B

MFC-SDI-ში.
07-04-2009, 00:41:07 | krolikaaa

საგოლ. სპლიტერები იცი ? მისმინე შენადა 3 ფანჯარა მინდა. 2 ფანჯარა მაქ სვეტად და მე-3 მინდა ქვემოტ ფორმვიუ რა. შეგიძლია დამაკვალიანო ?
07-04-2009, 00:39:40 | krolikaaa

დებილი ვარ პაროლი დამავიწყდა
11-10-2008, 22:59:27 | naruto


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