整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Qt編寫地圖綜合應(yīng)用24-miniblink內(nèi)核

          Qt編寫地圖綜合應(yīng)用24-miniblink內(nèi)核

          # 一、前言

          用Qt做項目過程中,遇到需要用到瀏覽器控件的項目,可能都會繞不開一個問題,那就是從Qt5.6版本開始mingw編譯器的Qt構(gòu)建套件,不再提供瀏覽器控件了,之前還可以用webkit控件,這下很多項目要么選擇5.6以下版本,要么選擇msvc的構(gòu)建套件,而且大部分的msvc構(gòu)建套件還不自帶瀏覽器控件,也需要自己編譯,只有原配的構(gòu)建套件比如Qt5.9+VS2015、Qt5.12+VS2017這種搭配才可能有瀏覽器控件,不然就算你勾選了瀏覽器控件也不會安裝,這樣就使得很多依賴瀏覽器控件的項目比較被動,于是必須尋找一個輕量級的瀏覽器控件來替代,比如cef、miniblink,個人更傾向于miniblink,用法極其簡單,依賴極其精簡就一個dll,在linux和mac系統(tǒng)上本來qt就一直會有瀏覽器控件,所以也就不涉及到跨平臺的問題,所以miniblink暫支持windows的缺點也就不算缺點了。

          miniblink是一個追求極致小巧的瀏覽器內(nèi)核項目,全世界第三大流行的瀏覽器內(nèi)核控件。其基于chromium最新版內(nèi)核,去除了chromium所有多余的部件,只保留最基本的排版引擎blink。miniblink保持了10M左右的極簡大小,是所有同類產(chǎn)品最小的體積,同時支持windows xp、npapi。miniblink的作者非常牛逼,QQ昵稱叫掃地僧,猶如天龍八部中的掃地僧一般,極其隱秘又武功極高,精通各種絕技,確實相當?shù)膶拧?/p>

          qt+miniblink用法步驟:

          - 第一步:調(diào)用wkeSetWkeDllPath函數(shù)加載dll文件路徑,一個項目只需要執(zhí)行一次。

          - 第二步:調(diào)用wkeInitialize初始化動態(tài)庫,一個項目只需要執(zhí)行一次。

          - 第三步:調(diào)用wkeCreateWebWindow創(chuàng)建一個瀏覽器控件,傳入句柄。

          - 第四步:調(diào)用wkeOnLoadingFinish注冊回調(diào)加載完成信號,有需要才注冊。

          - 第五步:調(diào)用wkeJsBindFunction注冊回調(diào)接收數(shù)據(jù)的方法,一定要放在這里在網(wǎng)頁加載前執(zhí)行。

          - 第六步:調(diào)用wkeLoadURL加載網(wǎng)址、wkeLoadFile加載網(wǎng)頁文件、wkeLoadHtmlWithBaseUrl加載網(wǎng)頁內(nèi)容。

          - 第七步:調(diào)用wkeRunJS執(zhí)行js函數(shù),超級簡單。

          - 第八步:調(diào)用wkeFinalize釋放資源,只要執(zhí)行一次,在整個項目結(jié)束的時候。

          qt+miniblink完整demo開源地址:

          [https://gitee.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink](https://gitee.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink)

          [https://github.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink](https://github.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink)

          ## 二、功能特點

          1. 同時支持在線地圖和離線地圖兩種模式。

          2. 同時支持webkit內(nèi)核、webengine內(nèi)核、miniblink內(nèi)核、IE內(nèi)核。

          3. 支持設(shè)置多個標注點,信息包括名稱、地址、經(jīng)緯度。

          4. 可設(shè)置地圖是否可單擊、拖動、鼠標滾輪縮放。

          5. 可設(shè)置協(xié)議版本、秘鑰、主題樣式、中心坐標、中心城市、地理編碼位置等。

          6. 可設(shè)置地圖縮放比例和級別,縮略圖、比例尺、路況信息等控件的可見。

          7. 支持地圖交互,比如鼠標按下獲取對應(yīng)位置的經(jīng)緯度。

          8. 支持查詢路線,可設(shè)置起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。

          9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。

          10. 可設(shè)置行政區(qū)劃,指定某個城市區(qū)域繪制圖層,在線地圖自動輸出行政區(qū)劃邊界點集合到j(luò)s文件給離線地圖使用。

          11. 可靜態(tài)或者動態(tài)添加多個覆蓋物。支持點、折線、多邊形、矩形、圓形、弧線、點聚合等。

          12. 提供函數(shù)接口處理經(jīng)緯度解析成地址和地址解析成經(jīng)緯度坐標。

          13. 提供的demo直接可以單獨選點執(zhí)行對應(yīng)的處理比如路線查詢。

          14. 可以拿到路線查詢到的點坐標信息集合,比如用于機器人坐標導(dǎo)航等。

          15. 封裝了豐富的函數(shù)比如刪除指定點和所有點,刪除指定覆蓋物和所有覆蓋物等。

          16. 標注點彈框信息可以自定義內(nèi)容,標準html格式。

          17. 標注點單擊事件可選 0-不處理 1-自己彈框 2-發(fā)送信號。

          18. 標注點可設(shè)置動畫效果 0-不處理 1-跳動 2-墜落

          19. 標注點可設(shè)置本地圖片文件等。

          20. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。

          21. 支持js動態(tài)交互添加點、刪除點、清空點、重置點,不需要刷新頁面。

          22. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

          ## 三、體驗地址

          1. 體驗地址:[https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A](https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A) 提取碼:o05q 文件名:bin_map.zip

          2. 國內(nèi)站點:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)

          3. 國際站點:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)

          4. 個人主頁:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

          5. 知乎主頁:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

          ## 四、效果圖

          ## 五、相關(guān)代碼

          載說明:原創(chuàng)不易,未經(jīng)授權(quán),謝絕任何形式的轉(zhuǎn)載

          本文章系《Unleashing the Power of CSS》(釋放CSS的力量,暫且這么翻譯吧)一書的學習筆記,希望通本書的學習,系統(tǒng)的梳理下CSS相關(guān)的高級新特性。本篇文章是其第一部分,由于全書英文版,理解和閱讀會有偏差,歡迎各位大佬們指正,我們一起共同提高。

          開篇

          在過去的幾年里,CSS引入了許多新的改進功能,并且跨瀏覽器的努力提高了兼容性,使這門語言比以往任何時候都更加穩(wěn)定!讓我們回顧一下布局、響應(yīng)式設(shè)計、元素樣式、屬性和選擇器方面的這些增強功能,并且也來看一看即將推出的新功能。

          現(xiàn)在,瀏覽器之間新功能的協(xié)調(diào)實施意味著我們幾乎可以在它們出現(xiàn)的同時開始使用這些功能,這對于保持我們的樣式表盡可能簡單非常有幫助。現(xiàn)在,只需幾個單行屬性就可以替代多行的hacky解決方案。在某些情況下,新提供的功能甚至可能意味著我們可以刪除以前需要的JavaScript解決方案,以解決舊限制!

          新的和增強的屬性

          Custom Properties(自定義屬性或變量)

          隨著Internet Explorer 11的生命周期進入尾聲,現(xiàn)在是時候開始使用自定義屬性了!自定義屬性,也被稱為“CSS變量”,允許我們定義可在樣式表中重復(fù)使用的值。自定義屬性可以作為屬性的整個值或部分值使用,我們還可以在JavaScript中修改自定義屬性。

          aspect-ratio

          一種新的屬性可以消除“填充hack”,它是 aspect-ratio 。它按照其名稱的意思,允許我們?yōu)樵囟x一個縱橫比。我所提到的 hack 通常用于保持視頻嵌入的16:9比例。現(xiàn)在,通過這個屬性和聲明 aspect-ratio: 16/9 ,可以實現(xiàn)這個比例。它還是實現(xiàn)完美正方形的快速方法,使用 aspect-ratio: 1 即可。

          這是一個代碼演示,展示了如何使用 aspect-ratio 與舊屬性 object-fit 結(jié)合使用,以保持一致的頭像大小,無論原始圖像的比例如何,而且不會扭曲圖像。

          Html部分

          <ul class="avatar-list">
            <li>
              <figure>
                <img src='https://images.unsplash.com/photo-1640952131659-49a06dd90ad2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NjkwNTE0MTQ&ixlib=rb-4.0.3&q=80&w=400' alt=''>
                <figcaption>Aaron Fizzle</figcaption>
              </figure>
            </li>
            <li>
              <figure>
                <img src='https://images.unsplash.com/photo-1544725176-7c40e5a71c5e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NjkwNTE0MTQ&ixlib=rb-4.0.3&q=80&w=400' alt=''>
                <figcaption>Lily Sebastian</figcaption>
              </figure>
            </li>
            <li>
              <figure>
                <img src='https://images.unsplash.com/photo-1628157588553-5eeea00af15c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NjkwNTE1MTU&ixlib=rb-4.0.3&q=80&w=400' alt=''>
                <figcaption>Devon Albian</figcaption>
              </figure>
            </li>
          </ul>

          Css部分

          .avatar-list img {
            /* Make it a square */
            aspect-ratio: 1;
            /* Fit the image to it's container without distortion */
            object-fit: cover;
            /* Make the square round */
            border-radius: 50%;
            width: 100%; /* Make sure the image fills the container */
            height: 100%; /* Make sure the image fills the container */
          }
          
          * {
            box-sizing: border-box;
            margin: 0;
          }
          
          html {
            height: 100%;
          }
          
          body {
            min-height: 100%;
            font-family: system-ui, sans-serif;
            display: grid;
            place-content: center;
            background-color: mediumvioletred;
            padding-inline: 1rem;
          }
          
          /* Standard responsive image fix */
          img {
            max-width: 100%;
          }
          
          .avatar-list {
            list-style: none;
            padding: 0;
            background: #fff;
            border-radius: 0.5rem;
            box-shadow: 0.25rem 0.25rem 0.5rem -0.15rem hsl(0 0% 0% / 30%);
            border: 1px solid hsl(0 0% 0% / 10%);
          }
          
          .avatar-list li {
            position: relative;
            padding: 3%;
            font-size: 1.35rem;
            font-size: clamp(0.8rem, 0.8rem + 2cqi, 1.5rem);
            color: hsl(0 0% 45%);
            letter-spacing: 0.03em;
          }
          
          .avatar-list li + li::before {
            content: "";
            position: absolute;
            top: 0;
            left: calc(15% + 1rem);
            right: 3%;
            border-top: 1px solid hsl(0 0% 0% / 15%);
          }
          
          .avatar-list figure {
            display: grid;
            grid-template-columns: 15% 1fr;
            align-items: center;
            gap: 1rem;
          }
          

          https://codepen.io/SitePoint/pen/oNaNaao

          Individual Transform Properties(個體變換屬性)

          瀏覽器中還新增了各自的變換屬性。Chrome 104進行的CSS變換具有獨立的屬性。這些屬性是 scale , rotate 和 translate ,您可以使用它們來單獨定義變換的各個部分。

          并非所有的轉(zhuǎn)換函數(shù)都有相應(yīng)的個體屬性,例如 skewX() 和 matrix() 。

          .target {
            translate: 50% 0;
            rotate: 30deg;
            scale: 1.2;
          }

          Logical Properties(邏輯屬性)

          CSS的Logical Properties(邏輯屬性)是一種用于處理文本和布局的屬性,它們考慮了文本流的邏輯方向而不是物理方向。在CSS中,文檔可以采用不同的書寫模式,例如從左到右(LTR)的水平書寫模式和從右到左(RTL)的水平書寫模式,以及垂直書寫模式。Logical Properties的目標是使樣式更加靈活,適應(yīng)不同的書寫模式,而不需要為每種書寫模式都編寫不同的樣式。

          如果我們要為國際受眾管理內(nèi)容,則可以考慮使用邏輯屬性。適用于大多數(shù) CSS 2.1 屬性,邏輯變體考慮了文本的編寫模式和流。對于標準的英文文本,我們將“左/右”換成“內(nèi)聯(lián)”,用“top/bottom”換成“block”:

          .element {
            margin-block: 2rem;
          }

          如上例所示,邏輯屬性還提供了一次設(shè)置兩邊的簡寫,其中 margin-block 水平寫入模式等效于 set margin-top 和 margin-bottom 。

          新的選擇器

          近期對CSS最有影響力的三個變化是:is、:where和:has偽類選擇器。以下是它們的概述:

          :is() ,它用于選擇滿足括號內(nèi)任何選擇器的元素。這個偽類可以幫助你編寫更簡潔和可維護的 CSS 代碼,尤其是當你需要同時匹配多個選擇器時。例如, :is(#id, a, .class) 將具有一個 id 的特異性。

          :where 是一個 CSS 偽類選擇器,它與 :is 偽類選擇器類似,可以用于選擇滿足括號內(nèi)任何選擇器的元素。它的語法也與 :is 相似,但有一個重要的區(qū)別::where 不會影響優(yōu)先級。

          與 :is 不同,:where 不會增加或改變樣式規(guī)則的優(yōu)先級。這意味著,無論你在樣式表中的什么位置使用 :where,它都不會改變選擇器的權(quán)重,不會增加特異性(specificity),也不會影響其他樣式規(guī)則的優(yōu)先級。

          這使得 :where 在一些情況下非常有用,特別是當你需要選擇一組元素,但不希望影響其他選擇器的優(yōu)先級時。例如,假設(shè)你有一個已經(jīng)存在的 CSS 樣式表,其中包含了一些具有不同權(quán)重和特異性的樣式規(guī)則,但你希望添加一個新的規(guī)則,同時不改變其他規(guī)則的優(yōu)先級,你可以使用 :where 來實現(xiàn)這一點。

          /* 不使用 :where */
          .btn {
            background-color: #3498db;
          }
          
          /* 使用 :where,不影響其他規(guī)則的優(yōu)先級 */
          :where(.btn-primary, .btn-secondary, .btn-danger) {
            background-color: #3498db;
            color: white;
          }

          :has() 是期待已久的“父選擇器”,它允許檢查父元素是否包含特定的子元素,并對父元素進行樣式設(shè)置,或者擴展為復(fù)合選擇器以對子元素進行樣式設(shè)置。(本系列教程中有關(guān)于 :has() 的完整教程。)

          這個演示利用 :where() 、 :is() 和 :has() 來創(chuàng)建一個作者簡介組件,根據(jù)是否有頭像來改變網(wǎng)格顯示屬性。

          <aside class="bio">
            <img class="avatar" src='https://images.unsplash.com/photo-1554727242-741c14fa561c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NzExNDcxMjM&ixlib=rb-4.0.3&q=80&w=400' alt=''>
            <h2>Jane Stylesheet</h2>
            <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsa quam aspernatur, nobis ex rem iure!</p>
          </aside>
          
          <aside class="bio">
            <h2>Bob Markup</h2>
            <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquam neque a blanditiis praesentium impedit.</p>
          </aside>
          * {
            box-sizing: border-box;
            margin: 0;
          }
          
          body {
            font-family: system-ui;
            padding: 3vw;
            background-color: mediumvioletred;
          }
          
          img {
            display: block;
            max-width: 100%;
          }
          
          :where(* + *) {
            margin-block-start: 1rem;
          }
          
          .bio :is(h2, p) {
            margin-block-start: 0;
          }
          
          .bio {
            background-color: white;
            display: grid;
            gap: 1rem;
            border-radius: 0.5rem;
            padding: 5%;
            box-shadow: 0 0 10px -2px hsl(0 0% 0% / 85%);
          }
          
          .bio:has(.avatar) {
            grid-template-areas: "avatar name" "avatar bio";
            grid-template-columns: min(25vw, 80px) 1fr;
          }
          
          .bio:has(.avatar) :not(.avatar) {
            grid-column: bio;
          }
          
          .bio .avatar {
            grid-area: avatar;
          }
          
          .avatar {
            aspect-ratio: 1;
            object-fit: cover;
            border-radius: 50%;
          }

          https://codepen.io/SitePoint/pen/WNaeJOy

          :has() 在撰寫本文時僅部分瀏覽器支持,因此上述演示目前僅適用于Safari 15.4+和Chrome/Edge 105+,以及啟用 layout.css.has-selector.enabled 標志的Firefox 103。

          增強的 :not()

          最近,:not() 選擇器已經(jīng)增強,可以接受一個選擇器列表,這使得 :not(nav a, footer a) 成為有效的語法。然而,與 :is() 和 :where() 不同,這個更新并沒有使 :not() 對于無效的選擇器更加寬容,因為需要保持向后兼容性支持。

          焦點選擇器

          下面的兩個新偽類都會影響焦點行為。當子元素處于焦點狀態(tài)時,可以使用 :focus-within 選擇器來為父元素設(shè)置樣式,比如表單字段周圍的容器。對于元素焦點樣式,我們現(xiàn)在可以使用 :focus-visible ,它最近取代了 :focus 成為跨瀏覽器默認的元素焦點樣式。

          下面是 :focus-within 的一些關(guān)鍵點和與 :focus 的區(qū)別:

          :focus-within 選擇器:

          • 選擇包含有焦點元素的祖先元素。
          • 當用戶在頁面上的某個元素上聚焦(例如,輸入框或按鈕),并且該元素是其祖先元素(例如,一個表單或一個包含該輸入框的 div)內(nèi)的子元素時,祖先元素將匹配 :focus-within。
          • 通常用于創(chuàng)建包含輸入框的表單的外觀,以在用戶輸入時改變整個表單的樣式或行為。

          :focus 選擇器:

          • 選擇當前具有焦點的元素。
          • 通常用于樣式化或增強當前擁有焦點的元素,例如,更改輸入框的邊框顏色或文本區(qū)域的背景顏色。
          • 不會選擇包含有焦點元素的父元素。

          假設(shè)有以下 HTML 結(jié)構(gòu):

          <div class="container">
            <input type="text" id="username" />
            <input type="password" id="password" />
          </div>

          現(xiàn)在,我們可以使用 :focus 和 :focus-within 來添加一些樣式:

          /* 當輸入框具有焦點時,樣式化輸入框本身 */
          input:focus {
            border: 2px solid blue;
          }
          
          /* 當包含有焦點輸入框的容器具有焦點時,樣式化整個容器 */
          .container:focus-within {
            background-color: lightgray;
          }
          

          在上面的示例中,當用戶點擊輸入框時,輸入框自身會具有藍色邊框(使用 :focus 選擇器),同時包含有焦點輸入框的容器 .container 也會變?yōu)榛疑尘埃ㄊ褂?:focus-within 選擇器)。這使得用戶在與表單交互時,不僅輸入框本身被強調(diào),整個表單容器也能夠獲得焦點的可視反饋。

          總之,:focus-within 選擇器用于選擇包含有焦點元素的祖先元素,而 :focus 選擇器用于樣式化具有焦點的元素本身。這兩個選擇器可以一起使用,以創(chuàng)建更豐富的交互體驗。

          ::marker

          最后但并非最不重要的是,偽元素 ::marker 允許我們直接選擇和樣式化 <ul> 和 <ol> 元素上的列表項符號和編號,以及 <summary> 元素的“插入符號”。這意味著我們可以使用 ::marker 來僅改變列表的符號顏色!

          元素樣式的改進

          accent-color

          框架和設(shè)計系統(tǒng)最常見的改變之一是本地表單字段樣式。在 accent-color 屬性出現(xiàn)之前,甚至改變表單元素的顏色都是不可能的。現(xiàn)在,我們可以通過 accent-color 影響單選按鈕和復(fù)選框的選中外觀,以及范圍輸入和進度元素的填充狀態(tài)。

          下面是一個示例,演示了如何使用 accent-color 屬性:

          a {
            accent-color: blue;
          }
          

          在這個示例中,accent-color 屬性應(yīng)用于所有鏈接元素 (<a>),并將鏈接的強調(diào)顏色設(shè)置為藍色。

          color-scheme

          如果我們想要根據(jù)用戶的淺色或深色模式偏好來調(diào)整我們的界面,可以使用自定義切換和/或 prefers-color-scheme 查詢,我們還應(yīng)該添加color-scheme屬性。這提供了一種選擇,可以適應(yīng)瀏覽器的UI元素,如滾動條、表單控件和CSS系統(tǒng)顏色。而 accent-color 讓我們可以為一些元素選擇自定義顏色, color-scheme 則要求瀏覽器進行更多的適應(yīng),例如要求文本輸入和文本區(qū)域以淺色或深色主題顯示。

          建議將此應(yīng)用于 :root 元素,并按照網(wǎng)站默認值的順序列出這些值。換句話說,如果我們默認為淺色但支持深色,則列出 light dark 。如果我們默認為深色但支持淺色,則列出 dark light 。如果我們只支持 light 或 dark ,只需列出單個值即可:

          :root {
            color-scheme: light dark;
          }

          例如,你可以這樣定義一個明亮模式和一個暗模式的顏色方案:

          /* 明亮模式 */
          @media (prefers-color-scheme: light) {
            body {
              background-color: white;
              color: black;
            }
          }
          
          /* 暗模式 */
          @media (prefers-color-scheme: dark) {
            body {
              background-color: black;
              color: white;
            }
          }
          

          Forced-color Modes (強制色彩模式)

          為了完善關(guān)于顏色的主題,還有一個偏好查詢和屬性對需要討論。在Windows上,一些用戶需要“高對比度”主題,其中操作系統(tǒng)強制使用減少的調(diào)色板來代替我們定義的顏色。調(diào)色板填充系統(tǒng)顏色的值,替換背景、文本、按鈕和鏈接顏色等內(nèi)容,而像盒子陰影這樣的樣式則被刪除。

          如果我們有使用顏色的關(guān)鍵樣式,比如產(chǎn)品顏色樣本,我們可能需要在 forced-colors 屬性旁邊使用 force-color-adjust 查詢。根據(jù)以下配對,我們原始的 .swatch 顏色將被保留:

          @media (forced-colors: active) {
            .swatch {
              forced-color-adjust: none;
            }
          }

          強制使用顏色應(yīng)該謹慎使用,只有在用戶體驗受到高對比度主題顏色交換的負面影響時才使用。如果您對高對比度主題不熟悉,請了解如何使用強制顏色進行樣式設(shè)置。

          Text Decoration

          在文本裝飾方面,我們現(xiàn)在有可用的 text-underline-offset 屬性,它允許我們調(diào)整定義的 text-decoration 的位置,使其偏離原始位置。 text-decoration-thickness 伴隨屬性允許我們控制 text-decoration 的描邊粗細。結(jié)合使用這些屬性,可以消除使用邊框甚至偽元素來樣式化鏈接下劃線的hack。

          以下樣式規(guī)則將文本下劃線向下偏移 2 像素:

          a {
            text-decoration: underline;
            text-underline-offset: 2px;
          }
          

          結(jié)束

          由于文章內(nèi)容篇幅有限,今天的內(nèi)容就分享到這里,文章結(jié)尾,我想提醒您,文章的創(chuàng)作不易,如果您喜歡我的分享,請別忘了點贊和轉(zhuǎn)發(fā),讓更多有需要的人看到。同時,如果您想獲取更多前端技術(shù)的知識,歡迎關(guān)注我,您的支持將是我分享最大的動力。我會持續(xù)輸出更多內(nèi)容,敬請期待。

          FC控件:

          Windows標準控件:

          windows標準控件由Windows 操作系統(tǒng)提供,在Windows 95中還提供了一些新增的控件。所有這些控件對象都是可編程的,我們可以使用Visual C++提供的對話框編輯器把它們添加到對話框中。Microsoft基礎(chǔ)類庫(MFC)提供了封裝這些控件的類,它們列于表6.1。

          在MFC 中,類CWnd是所有窗口類的基類,很自然的,它也是所控件類的基類。

          Windows標準控件在以下環(huán)境下提供:

          windows 95

          Windows NT 3.51及以后版本

          win32s 1.3

          注意:visual C++4.2及以后版本不再支持Win32s.

          MFC基本常用控件基本用法

          VC++控件工具箱:

          按鈕(Button)

          用來接收用戶的命令,應(yīng)用程序在接收到用戶命令后,通常需要進行一些后臺工作。按鈕可以響應(yīng)單擊或雙擊動作,在按鈕接收到鼠標動作后,向其父窗口發(fā)送相應(yīng)的控件通知,用戶可以對這些控件通知進行消息映射,從而進行相應(yīng)的處理。

          在一個對話框中,可以定義一個默認按鈕,這只要選中按鈕屬性中的“Default”選項。如果在對話框活動的時候按下了Enter鍵,則等同于單擊了默認按鈕。MFC提供了CButton類支持按鈕控件。

          復(fù)選框(Check Box)

          用來顯示某種可能的選擇,該項選擇是獨立的,用戶可以選中或取消該選項。在選項被選中的時候核選標記出現(xiàn),選項被取消時核選標記消失。MFC中由CButton類對核選框進行支持,用戶可以通過SetCheck()函數(shù)和GetCheck()函數(shù)設(shè)置或獲取核選框當前的狀態(tài)

          BST_UNCHECKED==((CButton*)GetDlgItem(IDC_CHECK_RES1))->GetCheck()
          ((CButton*)GetDlgItem(IDC_CHECK_RES1))->SetCheck(true);		

          編輯框(Edit Control)

          用來接收用戶輸入的字符串通過選擇編輯框的選項,編輯框可以接收字符串、數(shù)字、密碼等;編輯框還可以設(shè)置成接收多行字符串的模式;可以自動進行大小寫轉(zhuǎn)換。編輯框可能向父窗口發(fā)送多種控件通知,如果用戶需要,可以對這些控件通知進行處理。MFC提供了CEdit類支持編輯框控件

          GetDlgItem(IDC_***)->SetWindowText(Cstring);
           
          GetDlgItem(IDC_***)->GetWindowText(Cstring);

          組合框(Combo Box)

          列表框和編輯框的組合,用戶除了可以在列表中對已經(jīng)存在的選項進行選擇外,還可以輸入新的選擇。MFC提供了CComboBox類對組合框控件進行支持。

          CComboBox * AAA=(CComboBox*)(GetDlgItem(IDC_***));
           
          AAA->AddString(_T("***"));
           
          AAA->SelectString(0, _T("***"));
           
          AAA->SetCurSel(0);
           
           
          int nSel=AAA->GetCurSel();
           
          AAA->GetLBText(nSel, Cstring);
           
          if(strType.Trim()==_T("***"))

          列表框(List Box)

          用來選擇一系列的可能選擇,用戶通過滾動條可以在這些選擇中瀏覽。在列表框中,可以進行單項選擇,也可以進行多項選擇,這取決于用戶在控件屬性對話框中的設(shè)置。MFC提供了CListBox類對列表框控件進行支持。

          組成框(Group Box)

          用來包圍具有邏輯關(guān)系的一組控件,在這些控件的周圍加上邊界和標題。需注意的是,組成框僅僅是在視覺效果上對控件進行“成組”,真正的“成組”工作還需要另外一些工作。僅僅在視覺上展現(xiàn)出一組的邏輯關(guān)系,并不添加任何代碼

          單選按鈕(Radio Button)

          用來選擇某種可能的選擇,與 (Check Box)復(fù)選框不同,該選項不是獨立的

          一般是幾個單選按鈕組成一組同組中的單選按鈕僅有一個按鈕被選中

          MFC同樣使用CButton類對單選按鈕控件進行支持

          SetCheck()函數(shù)和GetCheck()函數(shù)對單選按鈕也是適用的。

          靜態(tài)文本(Static Text)

          用來在指定的位置顯示特定的字符串一般用來標識附近另一個控件的內(nèi)容。顯示在靜態(tài)文本控件中的字符串一般不再改變,但是在需要的時候,必須為其指定一個不同食物ID號,通過調(diào)用相應(yīng)的函數(shù)來進行設(shè)置。MFC提供了CStatic類支持靜態(tài)控件

          圖形控件(Picture Control)

          顯示位圖(Bitmap)和圖標(Icon),圖形繪制與顯示,主要是其方形的區(qū)域適合顯示,同樣方形區(qū)域也可利用(Static Text)靜態(tài)文本框。

          滾動條(Scroll Bar)

          這包括水平滾動條和垂直滾動條,除了在視覺效果上的方向不同外,水平滾動條在被滾動時發(fā)生WM_HSCROLL消息,而垂直滾動條在被滾動時發(fā)送WM_VSCROLL消息MFC提供了CScrollBar進行支持

          滑塊控件(Slider Control)

          通常用來在程序中接受一系列離散的數(shù)值

          用戶可以設(shè)置滑塊控件的取值范圍,并可以為控件加上刻度標記以顯示特定位置的含義。

          MFC提供了CSliderCtrl類進行支持

          微調(diào)按鈕(Spin Button)

          包括一對緊靠在一起的上下箭頭,使用微調(diào)按鈕可以增大或者縮小某個特定的數(shù)值。

          微調(diào)按鈕往往都需要一個“伙伴”控件,這通常都是一個編輯框

          當微調(diào)按鈕的向上箭頭被單擊時,編輯框中的數(shù)字就增大;反之則減小MFC提供了CPinButtonCtrl類進行支持

          進度條(Progress Control)

          進行一項需要較長時間的操作時來反應(yīng)當前的進度

          當操作的進度不斷前進時,進度條就用特色顏色填充進度條框。用戶可以設(shè)定進度條的范圍和當前位置。

          MFC提供了CProgressCtrl類進行支持

          CProgressCtrl* progressbar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS_1);
           
          progressbar->SetRange(0, 4);
           
          progressbar->SetPos(0);

          熱鍵控制(Hot Key)

          熱鍵控件看起來就像一個編輯框,但是在熱鍵控件中能夠立刻反應(yīng)用戶剛剛按下的鍵組合,這在設(shè)置程序的熱鍵時特別有用。

          熱鍵控件只是在“視覺”上顯示了按鍵組合,設(shè)置熱鍵的工作還需要用戶添加代碼完成。

          MFC提供了CHotKey類進行支持

          列表控制(List Control)

          按一定的排列順序顯示一系列帶圖標的字符串。

          列表控件提供了四種顯示模式:大圖標(Icon)、小圖標(Small Icon)、列表(List)和報表(Report)

          用戶可以向列表控件中添加新的項,也可以控制列表控件的顯示模式。

          MFC提供了CListCtrl類進行支持

          初始化:

           struct INFO { int id; CString time; CString type; }info; CString id; int nRow=0; id.Format(_T("%d"), info.id); m_ListCtrl.InsertItem(nRow,id); m_ListCtrl.SetItemText(nRow, 1, info.time); m_ListCtrl.SetItemText(nRow, 2, info.type); nRow ++;


          添加記錄:

           
          struct INFO
           
          {
           
          int id;
           
          CString time;
           
          CString type;
           
          }info;
           
          CString id;
           
          int nRow=0;
           
          id.Format(_T("%d"), info.id);
           
          m_ListCtrl.InsertItem(nRow,id);
           
          m_ListCtrl.SetItemText(nRow, 1, info.time);
           
          m_ListCtrl.SetItemText(nRow, 2, info.type);
           
          nRow ++;

          樹形控件(Tree Control)

          顯示一系列項目的層次關(guān)系最典型的例子是顯示磁盤上的文件與文件夾

          如果有子項目的話,單擊樹形控件中的項目可以展開或者收縮其子項目

          MFC提供了CTreeCtrl類進行支持

          初始化

             void CConfigDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: 在此處添加消息處理程序代碼  CRect rcWnd; GetClientRect(&rcWnd);  CRect rcChild=rcWnd; rcChild.top=rcWnd.top+10; rcChild.bottom -=10; rcChild.left +=160; rcChild.right -=10; CRect laneRect=rcChild;  if(::IsWindow(m_1Dlg)) m_1Dlg.MoveWindow(rcChild);  if(::IsWindow(m_2Dlg)) m_2Dlg.MoveWindow(rcChild);   if ( ::IsWindow( pTree.GetSafeHwnd() ) ) { pTree.MoveWindow(rcWnd.left+10,rcWnd.top+30,130,350,1); } }

          樹節(jié)點切換

             void CConfigDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView=reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // TODO: 在此添加控件通知處理程序代碼 HTREEITEM hSelected=pNMTreeView->itemNew.hItem; if(hSelected!=NULL) { pTree.SelectItem(hSelected); int nDat=pTree.GetItemData(hSelected);  switch(nDat) { case 1: /*MessageBox(_T("YNAME"));*/ if(m_pPreWnd) m_pPreWnd->ShowWindow(SW_HIDE);  m_1Dlg.ShowWindow(SW_SHOW); m_pPreWnd=&m_1Dlg; break; case 3: /*MessageBox(_T("XNAME"));*/ if(m_pPreWnd) m_pPreWnd->ShowWindow(SW_HIDE);  m_2Dlg.ShowWindow(SW_SHOW); m_pPreWnd=&m_2Dlg; break;  default: break; } } *pResult=0; }

          改變位置

             void CConfigDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: 在此處添加消息處理程序代碼  CRect rcWnd; GetClientRect(&rcWnd);  CRect rcChild=rcWnd; rcChild.top=rcWnd.top+10; rcChild.bottom -=10; rcChild.left +=160; rcChild.right -=10; CRect laneRect=rcChild;  if(::IsWindow(m_1Dlg)) m_1Dlg.MoveWindow(rcChild);  if(::IsWindow(m_2Dlg)) m_2Dlg.MoveWindow(rcChild);   if ( ::IsWindow( pTree.GetSafeHwnd() ) ) { pTree.MoveWindow(rcWnd.left+10,rcWnd.top+30,130,350,1); } }

          屬性表控件(Tab Control)

          包含大量的控件,可以滿足用戶顯示或者獲取大量數(shù)據(jù)分類顯示的要求,典型例子是Windows任務(wù)欄每個程序標簽。

          每個屬性表又分為好幾個屬性頁,這些屬性頁由各自的標簽進行區(qū)分,這些屬性頁中都可以包容其他控件

          在顯示屬性表的時候,一次只能夠顯示一個屬性頁的全部內(nèi)容,同時顯示其他屬性頁的標簽,用戶通過單擊標簽打開相應(yīng)的屬性頁。

          MFC提供了CTabCtrl類進行支持

          初始化綁定變量

          m_tab_Light.DeleteAllItems();
           
          m_LightParkingDlg.DestroyWindow();
           
          m_LightStatusDlg.DestroyWindow();
           
          m_tab_Light.InsertItem(0, _T("0001")); // 插入第一個標簽
           
          m_tab_Light.InsertItem(1, _T("0002")); // 插入第二個標簽
           
           
          CRect tabRect; // 標簽控件客戶區(qū)的位置和大小
           
          m_tab_Light.GetClientRect(&tabRect); // 獲取標簽控件客戶區(qū)Rect
           
          // 調(diào)整tabRect,使其覆蓋范圍適合放置標簽頁
           
          tabRect.left +=2;
           
          tabRect.right -=1;
           
          tabRect.top +=21;
           
          tabRect.bottom -=2;
           
          m_LightParkingDlg.Create(IDD_DIALOG_LIGHT_PARKING, &m_tab_Light); // 創(chuàng)建第一個標簽頁
           
          m_LightStatusDlg.Create(IDD_DIALOG_LIGHT_STATUS, &m_tab_Light); // 創(chuàng)建第二個標簽頁
           
          //m_LightParkingDlg.InitData();
           
          m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(),SWP_SHOWWINDOW);

          控件頁面切換

           CRect tabRect; // 標簽控件客戶區(qū)的位置和大小
           
          m_tab_Light.GetClientRect(&tabRect); // 獲取標簽控件客戶區(qū)Rect
           
          // 調(diào)整tabRect,使其覆蓋范圍適合放置標簽頁
           
          tabRect.left +=2;
           
          tabRect.right -=1;
           
          tabRect.top +=21;
           
          tabRect.bottom -=2;
           
          switch (m_tab_Light.GetCurSel())
           
          {
           
           
          case 0:
           
          m_LightStatusDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
           
          m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
           
          break;
           
          case 1:
           
          m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
           
          m_LightStatusDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
           
          break;
           
           
          }

          動畫控件(Animation):

          用來播放一段AVI格式的視頻剪輯。用戶可以控制視頻剪輯的播放、停止和定位,但也僅限于這些功能。動畫控件設(shè)置不能播放音頻剪輯,如果用戶需要更高層次的視頻或者音頻的支持,請選用MCIWnd控件

          MFC提供了CAnimateCtrl類對動畫控件進行支持

          高級編輯框(Rich Edit)

          編輯控件(Edit Control)功能的擴展。在高級編輯框中,除了簡單的輸入和編輯字符串外,用戶還可以為字符或段落指定特定的格式,用戶甚至還可以向高級編輯框中插入OLE項

          高級編輯框基本上實現(xiàn)了一個帶格式的文本編輯器功能,而只需要用戶添加少量的接口。

          MFC提供了CRichEditCtrl類進行支持

          日期/時間選擇器(Date Time Picker)

          向用戶提供了一種直觀的選擇日期和時間的方法、日期/時間選擇器在外觀上類似于一個組合框,但是當用戶單擊下拉箭頭時就會展開一個日歷控件供用戶選擇,而一旦用戶做出了選擇,日期/時間選擇器會自動顯示新的日期/時間。MFC提供了CDateTimeCtrl類進行支持。

          SYSTEMTIME times_1; //開始時間日期
           
          SYSTEMTIME timee_1; //結(jié)束時間日期
           
           
          CDateTimeCtrl* dtPickctrs_1=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_START1); //獲取時間控件句柄
           
          CDateTimeCtrl* dtPickctre_1=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_END1);
           
           
          memset(×_1,0,sizeof(times_1)); //時鐘初始化
           
          memset(&timee_1,0,sizeof(timee_1));
           
           
          dtPickctrs_1->GetTime(×_1); //獲取控件所選時間,保存至變量
           
          dtPickctre_1->GetTime(&timee_1);
           
           
           
          CString strTimeStart; //將時間轉(zhuǎn)換為字符串
           
          strTimeStart.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), times_1.wYear,times_1.wMonth,times_1.wDay,times_2.wHour,times_2.wMinute,times_2.wSecond);
           
          CString strTimeEnd;
           
          strTimeEnd.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), timee_1.wYear,timee_1.wMonth,timee_1.wDay,timee_2.wHour,timee_2.wMinute,timee_2.wSecond);
           


          獲取系統(tǒng)時間

          SYSTEMTIME time;
           
          ::GetLocalTime(&time);

          日歷控件(Month Calender)

          如下圖,看似與真正的日歷類似,操作也類似,直觀的為用戶提供了觀察和顯示當前日期的途徑。MFC提供了CMonthCalCtrl類進行支持

          IP地址控件(IP Adress)

          IP地址控件用來輸入和編輯IP地址MFC提供了CIPAddressCtrl類進行支持

          該控件外觀類似于一個編輯框,但是可以自動對輸入的字符按3個一組進行區(qū)分和加間隔圓點。IP地址控件為開發(fā)支持Internet技術(shù)的程序提供了方便。

          擴展組合框(Extended Combo Box)

          在普通組合框(Combo Box)的基礎(chǔ)上還支持圖像列表

          可以在組合框中顯示特定的圖標表示相應(yīng)的選擇,而不僅僅是顯示文本。

          MFC提供了CComboBoxEx類進行支持

          用戶自定義控件(Custom Control)

          控件使用的時候,它的Class必須有一個類的支持這個窗口類可以VC的類,例如:Button、Edit.在頭文件增加一個CEdit類的成員變量:CEdit m_Text(即點擊右鍵添加變量),然后按照Edit控件使用即可。


          超鏈接控件(SysLink Control ):

          1.用于在 MFC 應(yīng)用程序上添加超鏈接,就像html中的超鏈接一樣。你點下可以鏈接到一個網(wǎng)頁上去。拖控件到頁面上,并綁定一個變量(m_linkCtrl),里面的內(nèi)容全部是按照標準的html中href的用法寫的。寫錯了自然鏈接不了的。

          可以去瞧下html里面的href屬性是怎/么設(shè)置的.另外要注意的是字符串中雙引號的處理(記得加個轉(zhuǎn)義符\),添加單擊響應(yīng)消息

          m_linkCtrl.SetWindowTextW(_T("<a href=\"http://blog.csdn.net/miko_xiaoming\">Miko's Note</a>"));
           
          PNMLINK pNMLink=(PNMLINK) pNMHDR;
           
          ShellExecuteW(NULL, L"open", pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL); //在瀏覽器中打開

          2.同按鈕(Button)控件一樣,響應(yīng)相應(yīng)的消息


          多按鈕組合控件(Split Button Control )

          如下圖,實現(xiàn)多選按鈕選擇功能,使用時添加相應(yīng)菜單


          網(wǎng)絡(luò)IP地址輸入輸出控件(Network Address Control):

          可以直接作為inet_addr(ip)的輸入,分隔符為逗號(,)

          指令按鈕控件(command button control)

          不僅可以為按鈕添加相應(yīng)命令還可以對命令做出注解

          所有控件的公共屬性:

          ID:控件的資源標識。

          Visiable:控件是否可見。

          Disabled:控件是否被禁止、被禁止的控件無法接受鍵盤和鼠標輸入。

          Group:是否從這個空間開始一個新組。

          Tab stop:在程序中是否可以用【Tab】鍵切換到這個控件。

          Help ID:是否給控件分配一個幫助標識,幫助標識基于控件本身的資源標識。

          Client edge:給控件增加一個凹陷的邊界,使整個控件看起來像是凹下去的一樣。

          Static edge:給控件增加一個邊界。

          Modal frame:給控件增加一個3維的框架,與Client edge相反,它是凸出來的。

          Transparent:擁有此屬性的窗口是透明的,它下面的窗口不會被它遮掩住。

          Accept files:擁有此屬性的窗口可以接收拖放文件,如果一個文件被拖動到這個控件上面,控件會收到WM_DROPFILES消息。

          No parent notify:表示控件不向其父窗口發(fā)送WM_PARENTNOTIFY消息。

          Right aligned text:表示文本右對齊。

          以上屬性可通過控件的屬性對話框進行設(shè)置,在屬性對話框中按【F1】鍵可以查看屬性的幫助信息。

          每一種控件都由一個MFC控件類來管理,當通過資源編輯器在對話框上添加一個控件時,visualC++會自動為控件類生成一個實例,即對象,并調(diào)用構(gòu)造函數(shù),當對話框關(guān)閉時,其各個子控件對象被自動銷毀。

          也可以不使用資源編輯器,自己在程序中寫代碼創(chuàng)建、顯示控件并設(shè)置控件的屬性。

          所有的控件類都來自CWnd,控件的某些操作和屬性設(shè)置需要用到CWnd本身的成員函數(shù),CWnd某些函數(shù)經(jīng)常用來操縱控件和設(shè)置控件屬性。

          SetWindowText:設(shè)置控件上要顯示的標題文本,即用來設(shè)置控件的caption屬性

          GetWindowText:得到控件的標題文本

          EnableWindow:設(shè)置控件的Disabled屬性,即社會自控件是否可以接收鍵盤和鼠標的輸入

          SetWindowPos:改變窗口的大小、位置和Z軸次序。

          MoveWindow:改變窗口的大小和位置

          GetWindowRec:得到窗口的大小、位置(信息存放在一個矩形結(jié)構(gòu)中)。

          GetClientRect:得到窗口客戶區(qū)的大小(信息存放在一個矩形結(jié)構(gòu)中 )

          ShowWindow:設(shè)置窗口的可見性(即窗口是否可見)

          SetWindowText/GetWindowText還可以用來設(shè)置/得到對話框的標題文本。

          福利來啦~

          學習從來不是一個人的事情,要有個相互監(jiān)督的伙伴,對于C/C++感興趣可以關(guān)注小編在后臺私信我:【編程交流】一起來學習哦!可以領(lǐng)取一些C/C++的項目學習視頻資料哦!


          主站蜘蛛池模板: 视频一区二区中文字幕| 亚洲精品伦理熟女国产一区二区 | 精品人妻一区二区三区四区| 一区二区三区电影网| 久久国产高清一区二区三区| 人妻少妇精品一区二区三区| 精品福利一区二区三区免费视频| 中文字幕精品一区二区2021年| 国产高清精品一区| 一区二区三区视频| 国产精品高清一区二区三区不卡| 人妻无码一区二区视频| 无码日韩精品一区二区免费| 国产亚洲欧洲Aⅴ综合一区| 精品乱码一区内射人妻无码| 中文字幕人妻第一区| 一本大道在线无码一区| 中文字幕在线一区二区在线| 久久国产一区二区三区| 亚洲线精品一区二区三区| 免费看一区二区三区四区| 中文字幕精品无码一区二区三区| 丝袜人妻一区二区三区| 国产精品亚洲综合一区| 精品一区二区三区中文字幕| 无码人妻视频一区二区三区| 蜜臀Av午夜一区二区三区| 亚洲色无码专区一区| 视频一区二区在线播放| 香蕉一区二区三区观| 亚洲一区二区三区香蕉| 亚洲天堂一区二区三区| 欧美日韩综合一区二区三区| 国产在线步兵一区二区三区| 亚洲国产一区明星换脸| 无码少妇精品一区二区免费动态| 亚洲AV无码一区二区三区牲色| 波多野结衣中文字幕一区| 久久er99热精品一区二区| 日本一区二区三区在线视频 | 无码AV一区二区三区无码|