• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            專注于服務(wù)器編程、網(wǎng)絡(luò)編程

            ~~保持一顆平常心~~持之以恒~~
            posts - 18, comments - 7, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            一、窗口的繪制


            繪制窗體實(shí)際上可以看作是繪制輪廓和繪制組件兩個(gè)部分。

            我們先看這么一個(gè)文件 CustCoordinates.c

            這個(gè)文件主要是定義了這么一個(gè)宏 g_categories_controls_map:

            或者類似于這樣的定義,這個(gè)數(shù)組就具體的將窗體的輪廓以及窗體的各個(gè)組件的位置作出了定義

            下面我們以一個(gè)具體的例子作為說明:

            const U8 category5[] =

            {

                5,                                         // 這個(gè)代表組件的個(gè)數(shù);

                DM_BASE_LAYER_START,                                     // 開始層;

                DM_SCR_BG,                                                             // 背景;

                DM_BASE_CONTROL_SET1,              //表示窗體的基本組成——狀態(tài)欄、標(biāo)題和軟按鍵

                DM_MULTILINE_INPUTBOX1,                   //多行輸入框

                DM_CATEGORY_CONTROLLED_AREA    // 輸入法的部分;

            };

            這些組件被定義在枚舉結(jié)構(gòu)mmi_dm_control_ids_enum中。


            const S16 coordinate_set5[] =

            {

                DM_FULL_SCREEN_COORDINATE_FLAG,      

                DM_CONTENT_COORDINATE_FLAG,

                DM_FULL_SCREEN_COORDINATE_FLAG

            };

            這個(gè)數(shù)組是這些組件的屬性;這個(gè)屬性主要是指各個(gè)組件的坐標(biāo),高度,寬度;

            這些數(shù)組里面定義的內(nèi)容通過dm_get_coordinates() 這個(gè)函數(shù)映射到 具體的繪制過程中;

            在dm_get_coordinates 這個(gè)函數(shù)中我們可以看到,這些 DM_FULL_SCREEN_COORDINATE_FLAG常量實(shí)際上都被轉(zhuǎn)化為坐標(biāo)。


            現(xiàn)在我們回到剛才的那個(gè)函數(shù) ShowCategory..Screen() 中來。下圖是個(gè)典型的窗口圖:


            以下為例子:


            void ShowCategory353Screen(

                    U8 *title,

                    U16 title_icon,

                    U16 left_softkey,

                    U16 left_softkey_icon,

                    U16 right_softkey,

                    U16 right_softkey_icon,

                    S32 number_of_items,

                    U8 **list_of_items,

                    U16 *list_of_icons,

                    U8 **list_of_descriptions,

                    S32 flags,

                    S32 highlighted_item,

                    U8 *history_buffer)

            {

                /*----------------------------------------------------------------*/

                /* Local Variables                                                */

                /*----------------------------------------------------------------*/

                dm_data_struct dm_data;

                S32 i;

                U8 h_flag;


                /*----------------------------------------------------------------*/

                /* Code Body                                                      */

                /*----------------------------------------------------------------*/

            gdi_layer_lock_frame_buffer(); // 鎖定當(dāng)前層的buffer;


            // 創(chuàng)建一個(gè)列表式的窗口

                create_fixed_icontext_menuitems();

                associate_fixed_icontext_list();

                     // 并將窗口下的內(nèi)容,包括標(biāo)題欄,左右軟件,以及各個(gè)子菜單的圖標(biāo) 顯示出來;

                ShowListCategoryScreen(

                    (UI_string_type) title,

                    get_image(title_icon),

                    get_string(left_softkey),

                    get_image(left_softkey_icon),

                    get_string(right_softkey),

                    get_image(right_softkey_icon),

                    number_of_items);


                if (list_of_descriptions == NULL)

            {

                    for (i = 0; i < number_of_items; i++)

                    {

                        add_fixed_icontext_item((UI_string_type) list_of_items[i], wgui_get_list_menu_icon(i, list_of_icons[i]));

                        wgui_pop_up_description_strings[i].text_strings[0] = NULL;

                   }

                }

                else

                {

                    for (i = 0; i < number_of_items; i++)

                    {

                        add_fixed_icontext_item((UI_string_type) list_of_items[i], wgui_get_list_menu_icon(i, list_of_icons[i]));

                        wgui_pop_up_description_strings[i].text_strings[0] = (UI_string_type) list_of_descriptions[i];

                    }

            }


                h_flag = set_list_menu_category_history(MMI_CATEGORY52_ID, history_buffer);


                     // 高亮當(dāng)前選中的ITEM

                if (h_flag)

                {

                    fixed_list_goto_item_no_redraw(MMI_fixed_list_menu.highlighted_item);

                }

                else

                {

                    fixed_list_goto_item_no_redraw(highlighted_item);

                }

                MMI_title_string = (UI_string_type) title;

                MMI_title_icon = (PU8) get_image(title_icon);

                set_pop_up_descriptions(1, number_of_items, MMI_fixed_list_menu.highlighted_item);

                gdi_layer_unlock_frame_buffer();

            // 前面這整個(gè)一段是用來繪制一個(gè)列表窗口,這部分的內(nèi)容基本上根據(jù)自己的選擇有什么畫什么;


            // 而下面的內(nèi)容是每個(gè)窗體都共有的部分;

                ExitCategoryFunction = ExitListCategoryScreen;

                dm_setup_category_functions(dm_redraw_category_screen,dm_get_category_history, dm_get_category_history_size);

                dm_data.s32ScrId = (S32) GetActiveScreenId();

                dm_data.s32CatId = MMI_CATEGORY52_ID;

                dm_data.s32flags = 0;

                dm_setup_data(&dm_data);

               dm_redraw_category_screen();

            }   /* end of ShowCategory353Screen */


            因?yàn)镸TK后面的代碼的gui 部分是用 draw_manager 這個(gè)來控制的,因此所有的窗口的控件的實(shí)際繪制過程都是通過 dm_redraw_category_screen(); 這個(gè)函數(shù)來實(shí)現(xiàn)的;這個(gè)函數(shù)可以幫助我們繪制一些比較特殊的自己需要的組件,當(dāng)然如果我們使用的組件已經(jīng)包含在這個(gè)函數(shù)里面,那么直接使用。

            可以分析一下這個(gè)函數(shù)的流程:

            獲取窗體模版的ID; // 這個(gè)在showcategory里面實(shí)現(xiàn),dm_data.s32CatId = MMI_CATEGORY52_ID;

                                                                                  ↓

            根據(jù)模版的ID得到組件的集合和個(gè)數(shù);

            // control_set_ptr = dm_search_control_set((U16) g_dm_data.s32CatId, &DeafultCoordinateSet_p);

                                                                                       ↓

            根據(jù)模版ID得到組件屬性標(biāo)識(shí)的集合;

            // UICtrlAccessPtr_p = dm_search_coordinate_set(g_dm_data.s32ScrId);

                                                                                       ↓

            鎖定當(dāng)前的frame,各個(gè)組件繪制前的任務(wù)準(zhǔn)備就緒;// gdi_layer_lock_frame_buffer();

                                                                                       ↓

            繪制窗體之前,還可以改變窗體的大小;

            // UICtrlAccessPtr_p = dm_get_cat_scr_coordinates(UICtrlAccessPtr_p, &dm_cat_scr_info);

                                                                                       ↓

            獲取不同組件的不同屬性,并根據(jù)不同的屬性繪制出自己需要的窗口;

            // for (u8CtrlCt = 1; u8CtrlCt <= u8NoOfUICtrls; u8CtrlCt++) 這個(gè)語句包含的內(nèi)容

                                                                                       ↓

            全部繪制完畢,整合GDI layer,將當(dāng)前frame 解鎖;


            上面已經(jīng)說明了一個(gè)窗體的繪制過程。另外與窗體相關(guān)的函數(shù)還有:

            Redrawcategory**screen(); 這個(gè)是窗體的刷新函數(shù);

            Exitcategory**screen() ; 這個(gè)是窗體的退出函數(shù)

            本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xzl04/archive/2009/04/14/4068447.aspx

            狠狠久久综合伊人不卡| 亚洲人成网亚洲欧洲无码久久| 伊人久久久AV老熟妇色| 久久人人爽人人爽人人片AV不| 无码专区久久综合久中文字幕| 久久国产亚洲精品无码| 精品久久一区二区三区| 国产精品99久久久久久猫咪 | 亚洲中文字幕久久精品无码喷水 | 亚洲AV日韩精品久久久久久| 国产三级久久久精品麻豆三级| 久久国产精品成人片免费| 韩国三级中文字幕hd久久精品| 伊人久久亚洲综合影院| 无码人妻久久久一区二区三区| 一级做a爱片久久毛片| 久久久久久久久66精品片| 久久99免费视频| 久久精品国产男包| 精品国产一区二区三区久久蜜臀| 久久婷婷是五月综合色狠狠| 亚洲狠狠综合久久| 亚洲国产另类久久久精品| 久久精品18| 国产精品狼人久久久久影院| 久久久久99精品成人片欧美| 亚洲国产高清精品线久久| 色综合久久88色综合天天| 97久久超碰国产精品旧版| 亚洲AV成人无码久久精品老人 | 青青草国产精品久久| 伊人久久无码中文字幕| 久久人妻无码中文字幕| 亚洲欧洲久久av| 国产精品无码久久综合网| 久久精品成人免费网站| MM131亚洲国产美女久久| 麻豆成人久久精品二区三区免费| 久久精品中文字幕一区| 亚洲精品久久久www| 怡红院日本一道日本久久 |