Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
用Qt做項目過程中,遇到需要用到瀏覽器控件的項目,可能都會繞不開一個問題,那就是從Qt5.6版本開始mingw編譯器的Qt構建套件,不再提供瀏覽器控件了,之前還可以用webkit控件,這下很多項目要么選擇5.6以下版本,要么選擇msvc的構建套件,而且大部分的msvc構建套件還不自帶瀏覽器控件,也需要自己編譯,只有原配的構建套件比如Qt5.9+VS2015、Qt5.12+VS2017這種搭配才可能有瀏覽器控件,不然就算你勾選了瀏覽器控件也不會安裝,這樣就使得很多依賴瀏覽器控件的項目比較被動,于是必須尋找一個輕量級的瀏覽器控件來替代,比如cef、miniblink,個人更傾向于miniblink,用法極其簡單,依賴極其精簡就一個dll,在linux和mac系統上本來qt就一直會有瀏覽器控件,所以也就不涉及到跨平臺的問題,所以miniblink暫支持windows的缺點也就不算缺點了。
miniblink是一個追求極致小巧的瀏覽器內核項目,全世界第三大流行的瀏覽器內核控件。其基于chromium最新版內核,去除了chromium所有多余的部件,只保留最基本的排版引擎blink。miniblink保持了10M左右的極簡大小,是所有同類產品最小的體積,同時支持windows xp、npapi。miniblink的作者非常牛逼,QQ昵稱叫掃地僧,猶如天龍八部中的掃地僧一般,極其隱秘又武功極高,精通各種絕技,確實相當的屌。
qt+miniblink用法步驟:
- 第一步:調用wkeSetWkeDllPath函數加載dll文件路徑,一個項目只需要執行一次。
- 第二步:調用wkeInitialize初始化動態庫,一個項目只需要執行一次。
- 第三步:調用wkeCreateWebWindow創建一個瀏覽器控件,傳入句柄。
- 第四步:調用wkeOnLoadingFinish注冊回調加載完成信號,有需要才注冊。
- 第五步:調用wkeJsBindFunction注冊回調接收數據的方法,一定要放在這里在網頁加載前執行。
- 第六步:調用wkeLoadURL加載網址、wkeLoadFile加載網頁文件、wkeLoadHtmlWithBaseUrl加載網頁內容。
- 第七步:調用wkeRunJS執行js函數,超級簡單。
- 第八步:調用wkeFinalize釋放資源,只要執行一次,在整個項目結束的時候。
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內核、webengine內核、miniblink內核、IE內核。
3. 支持設置多個標注點,信息包括名稱、地址、經緯度。
4. 可設置地圖是否可單擊、拖動、鼠標滾輪縮放。
5. 可設置協議版本、秘鑰、主題樣式、中心坐標、中心城市、地理編碼位置等。
6. 可設置地圖縮放比例和級別,縮略圖、比例尺、路況信息等控件的可見。
7. 支持地圖交互,比如鼠標按下獲取對應位置的經緯度。
8. 支持查詢路線,可設置起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
10. 可設置行政區劃,指定某個城市區域繪制圖層,在線地圖自動輸出行政區劃邊界點集合到js文件給離線地圖使用。
11. 可靜態或者動態添加多個覆蓋物。支持點、折線、多邊形、矩形、圓形、弧線、點聚合等。
12. 提供函數接口處理經緯度解析成地址和地址解析成經緯度坐標。
13. 提供的demo直接可以單獨選點執行對應的處理比如路線查詢。
14. 可以拿到路線查詢到的點坐標信息集合,比如用于機器人坐標導航等。
15. 封裝了豐富的函數比如刪除指定點和所有點,刪除指定覆蓋物和所有覆蓋物等。
16. 標注點彈框信息可以自定義內容,標準html格式。
17. 標注點單擊事件可選 0-不處理 1-自己彈框 2-發送信號。
18. 標注點可設置動畫效果 0-不處理 1-跳動 2-墜落
19. 標注點可設置本地圖片文件等。
20. 函數接口友好和統一,使用簡單方便,就一個類。
21. 支持js動態交互添加點、刪除點、清空點、重置點,不需要刷新頁面。
22. 支持任意Qt版本、任意系統、任意編譯器。
1. 體驗地址:[https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A](https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A) 提取碼:o05q 文件名:bin_map.zip
2. 國內站點:[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/)
載說明:原創不易,未經授權,謝絕任何形式的轉載
本文章系《Unleashing the Power of CSS》(釋放CSS的力量,暫且這么翻譯吧)一書的學習筆記,希望通本書的學習,系統的梳理下CSS相關的高級新特性。本篇文章是其第一部分,由于全書英文版,理解和閱讀會有偏差,歡迎各位大佬們指正,我們一起共同提高。
在過去的幾年里,CSS引入了許多新的改進功能,并且跨瀏覽器的努力提高了兼容性,使這門語言比以往任何時候都更加穩定!讓我們回顧一下布局、響應式設計、元素樣式、屬性和選擇器方面的這些增強功能,并且也來看一看即將推出的新功能。
現在,瀏覽器之間新功能的協調實施意味著我們幾乎可以在它們出現的同時開始使用這些功能,這對于保持我們的樣式表盡可能簡單非常有幫助。現在,只需幾個單行屬性就可以替代多行的hacky解決方案。在某些情況下,新提供的功能甚至可能意味著我們可以刪除以前需要的JavaScript解決方案,以解決舊限制!
隨著Internet Explorer 11的生命周期進入尾聲,現在是時候開始使用自定義屬性了!自定義屬性,也被稱為“CSS變量”,允許我們定義可在樣式表中重復使用的值。自定義屬性可以作為屬性的整個值或部分值使用,我們還可以在JavaScript中修改自定義屬性。
一種新的屬性可以消除“填充hack”,它是 aspect-ratio 。它按照其名稱的意思,允許我們為元素定義一個縱橫比。我所提到的 hack 通常用于保持視頻嵌入的16:9比例。現在,通過這個屬性和聲明 aspect-ratio: 16/9 ,可以實現這個比例。它還是實現完美正方形的快速方法,使用 aspect-ratio: 1 即可。
這是一個代碼演示,展示了如何使用 aspect-ratio 與舊屬性 object-fit 結合使用,以保持一致的頭像大小,無論原始圖像的比例如何,而且不會扭曲圖像。
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
瀏覽器中還新增了各自的變換屬性。Chrome 104進行的CSS變換具有獨立的屬性。這些屬性是 scale , rotate 和 translate ,您可以使用它們來單獨定義變換的各個部分。
并非所有的轉換函數都有相應的個體屬性,例如 skewX() 和 matrix() 。
.target {
translate: 50% 0;
rotate: 30deg;
scale: 1.2;
}
CSS的Logical Properties(邏輯屬性)是一種用于處理文本和布局的屬性,它們考慮了文本流的邏輯方向而不是物理方向。在CSS中,文檔可以采用不同的書寫模式,例如從左到右(LTR)的水平書寫模式和從右到左(RTL)的水平書寫模式,以及垂直書寫模式。Logical Properties的目標是使樣式更加靈活,適應不同的書寫模式,而不需要為每種書寫模式都編寫不同的樣式。
如果我們要為國際受眾管理內容,則可以考慮使用邏輯屬性。適用于大多數 CSS 2.1 屬性,邏輯變體考慮了文本的編寫模式和流。對于標準的英文文本,我們將“左/右”換成“內聯”,用“top/bottom”換成“block”:
.element {
margin-block: 2rem;
}
如上例所示,邏輯屬性還提供了一次設置兩邊的簡寫,其中 margin-block 水平寫入模式等效于 set margin-top 和 margin-bottom 。
近期對CSS最有影響力的三個變化是:is、:where和:has偽類選擇器。以下是它們的概述:
:is() ,它用于選擇滿足括號內任何選擇器的元素。這個偽類可以幫助你編寫更簡潔和可維護的 CSS 代碼,尤其是當你需要同時匹配多個選擇器時。例如, :is(#id, a, .class) 將具有一個 id 的特異性。
:where 是一個 CSS 偽類選擇器,它與 :is 偽類選擇器類似,可以用于選擇滿足括號內任何選擇器的元素。它的語法也與 :is 相似,但有一個重要的區別::where 不會影響優先級。
與 :is 不同,:where 不會增加或改變樣式規則的優先級。這意味著,無論你在樣式表中的什么位置使用 :where,它都不會改變選擇器的權重,不會增加特異性(specificity),也不會影響其他樣式規則的優先級。
這使得 :where 在一些情況下非常有用,特別是當你需要選擇一組元素,但不希望影響其他選擇器的優先級時。例如,假設你有一個已經存在的 CSS 樣式表,其中包含了一些具有不同權重和特異性的樣式規則,但你希望添加一個新的規則,同時不改變其他規則的優先級,你可以使用 :where 來實現這一點。
/* 不使用 :where */
.btn {
background-color: #3498db;
}
/* 使用 :where,不影響其他規則的優先級 */
:where(.btn-primary, .btn-secondary, .btn-danger) {
background-color: #3498db;
color: white;
}
:has() 是期待已久的“父選擇器”,它允許檢查父元素是否包含特定的子元素,并對父元素進行樣式設置,或者擴展為復合選擇器以對子元素進行樣式設置。(本系列教程中有關于 :has() 的完整教程。)
這個演示利用 :where() 、 :is() 和 :has() 來創建一個作者簡介組件,根據是否有頭像來改變網格顯示屬性。
<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(nav a, footer a) 成為有效的語法。然而,與 :is() 和 :where() 不同,這個更新并沒有使 :not() 對于無效的選擇器更加寬容,因為需要保持向后兼容性支持。
下面的兩個新偽類都會影響焦點行為。當子元素處于焦點狀態時,可以使用 :focus-within 選擇器來為父元素設置樣式,比如表單字段周圍的容器。對于元素焦點樣式,我們現在可以使用 :focus-visible ,它最近取代了 :focus 成為跨瀏覽器默認的元素焦點樣式。
下面是 :focus-within 的一些關鍵點和與 :focus 的區別:
:focus-within 選擇器:
:focus 選擇器:
假設有以下 HTML 結構:
<div class="container">
<input type="text" id="username" />
<input type="password" id="password" />
</div>
現在,我們可以使用 :focus 和 :focus-within 來添加一些樣式:
/* 當輸入框具有焦點時,樣式化輸入框本身 */
input:focus {
border: 2px solid blue;
}
/* 當包含有焦點輸入框的容器具有焦點時,樣式化整個容器 */
.container:focus-within {
background-color: lightgray;
}
在上面的示例中,當用戶點擊輸入框時,輸入框自身會具有藍色邊框(使用 :focus 選擇器),同時包含有焦點輸入框的容器 .container 也會變為灰色背景(使用 :focus-within 選擇器)。這使得用戶在與表單交互時,不僅輸入框本身被強調,整個表單容器也能夠獲得焦點的可視反饋。
總之,:focus-within 選擇器用于選擇包含有焦點元素的祖先元素,而 :focus 選擇器用于樣式化具有焦點的元素本身。這兩個選擇器可以一起使用,以創建更豐富的交互體驗。
最后但并非最不重要的是,偽元素 ::marker 允許我們直接選擇和樣式化 <ul> 和 <ol> 元素上的列表項符號和編號,以及 <summary> 元素的“插入符號”。這意味著我們可以使用 ::marker 來僅改變列表的符號顏色!
accent-color
框架和設計系統最常見的改變之一是本地表單字段樣式。在 accent-color 屬性出現之前,甚至改變表單元素的顏色都是不可能的。現在,我們可以通過 accent-color 影響單選按鈕和復選框的選中外觀,以及范圍輸入和進度元素的填充狀態。
下面是一個示例,演示了如何使用 accent-color 屬性:
a {
accent-color: blue;
}
在這個示例中,accent-color 屬性應用于所有鏈接元素 (<a>),并將鏈接的強調顏色設置為藍色。
如果我們想要根據用戶的淺色或深色模式偏好來調整我們的界面,可以使用自定義切換和/或 prefers-color-scheme 查詢,我們還應該添加color-scheme屬性。這提供了一種選擇,可以適應瀏覽器的UI元素,如滾動條、表單控件和CSS系統顏色。而 accent-color 讓我們可以為一些元素選擇自定義顏色, color-scheme 則要求瀏覽器進行更多的適應,例如要求文本輸入和文本區域以淺色或深色主題顯示。
建議將此應用于 :root 元素,并按照網站默認值的順序列出這些值。換句話說,如果我們默認為淺色但支持深色,則列出 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;
}
}
為了完善關于顏色的主題,還有一個偏好查詢和屬性對需要討論。在Windows上,一些用戶需要“高對比度”主題,其中操作系統強制使用減少的調色板來代替我們定義的顏色。調色板填充系統顏色的值,替換背景、文本、按鈕和鏈接顏色等內容,而像盒子陰影這樣的樣式則被刪除。
如果我們有使用顏色的關鍵樣式,比如產品顏色樣本,我們可能需要在 forced-colors 屬性旁邊使用 force-color-adjust 查詢。根據以下配對,我們原始的 .swatch 顏色將被保留:
@media (forced-colors: active) {
.swatch {
forced-color-adjust: none;
}
}
強制使用顏色應該謹慎使用,只有在用戶體驗受到高對比度主題顏色交換的負面影響時才使用。如果您對高對比度主題不熟悉,請了解如何使用強制顏色進行樣式設置。
在文本裝飾方面,我們現在有可用的 text-underline-offset 屬性,它允許我們調整定義的 text-decoration 的位置,使其偏離原始位置。 text-decoration-thickness 伴隨屬性允許我們控制 text-decoration 的描邊粗細。結合使用這些屬性,可以消除使用邊框甚至偽元素來樣式化鏈接下劃線的hack。
以下樣式規則將文本下劃線向下偏移 2 像素:
a {
text-decoration: underline;
text-underline-offset: 2px;
}
由于文章內容篇幅有限,今天的內容就分享到這里,文章結尾,我想提醒您,文章的創作不易,如果您喜歡我的分享,請別忘了點贊和轉發,讓更多有需要的人看到。同時,如果您想獲取更多前端技術的知識,歡迎關注我,您的支持將是我分享最大的動力。我會持續輸出更多內容,敬請期待。
Windows標準控件:
windows標準控件由Windows 操作系統提供,在Windows 95中還提供了一些新增的控件。所有這些控件對象都是可編程的,我們可以使用Visual C++提供的對話框編輯器把它們添加到對話框中。Microsoft基礎類庫(MFC)提供了封裝這些控件的類,它們列于表6.1。
在MFC 中,類CWnd是所有窗口類的基類,很自然的,它也是所控件類的基類。
Windows標準控件在以下環境下提供:
windows 95
Windows NT 3.51及以后版本
win32s 1.3
注意:visual C++4.2及以后版本不再支持Win32s.
VC++控件工具箱:
用來接收用戶的命令,應用程序在接收到用戶命令后,通常需要進行一些后臺工作。按鈕可以響應單擊或雙擊動作,在按鈕接收到鼠標動作后,向其父窗口發送相應的控件通知,用戶可以對這些控件通知進行消息映射,從而進行相應的處理。
在一個對話框中,可以定義一個默認按鈕,這只要選中按鈕屬性中的“Default”選項。如果在對話框活動的時候按下了Enter鍵,則等同于單擊了默認按鈕。MFC提供了CButton類支持按鈕控件。
用來顯示某種可能的選擇,該項選擇是獨立的,用戶可以選中或取消該選項。在選項被選中的時候核選標記出現,選項被取消時核選標記消失。MFC中由CButton類對核選框進行支持,用戶可以通過SetCheck()函數和GetCheck()函數設置或獲取核選框當前的狀態。
BST_UNCHECKED==((CButton*)GetDlgItem(IDC_CHECK_RES1))->GetCheck()
((CButton*)GetDlgItem(IDC_CHECK_RES1))->SetCheck(true);
用來接收用戶輸入的字符串。通過選擇編輯框的選項,編輯框可以接收字符串、數字、密碼等;編輯框還可以設置成接收多行字符串的模式;可以自動進行大小寫轉換。編輯框可能向父窗口發送多種控件通知,如果用戶需要,可以對這些控件通知進行處理。MFC提供了CEdit類支持編輯框控件。
GetDlgItem(IDC_***)->SetWindowText(Cstring);
GetDlgItem(IDC_***)->GetWindowText(Cstring);
列表框和編輯框的組合,用戶除了可以在列表中對已經存在的選項進行選擇外,還可以輸入新的選擇。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("***"))
用來選擇一系列的可能選擇,用戶通過滾動條可以在這些選擇中瀏覽。在列表框中,可以進行單項選擇,也可以進行多項選擇,這取決于用戶在控件屬性對話框中的設置。MFC提供了CListBox類對列表框控件進行支持。
用來包圍具有邏輯關系的一組控件,在這些控件的周圍加上邊界和標題。需注意的是,組成框僅僅是在視覺效果上對控件進行“成組”,真正的“成組”工作還需要另外一些工作。僅僅在視覺上展現出一組的邏輯關系,并不添加任何代碼
用來選擇某種可能的選擇,與 (Check Box)復選框不同,該選項不是獨立的。
一般是幾個單選按鈕組成一組,同組中的單選按鈕僅有一個按鈕被選中。
MFC同樣使用CButton類對單選按鈕控件進行支持,
SetCheck()函數和GetCheck()函數對單選按鈕也是適用的。
用來在指定的位置顯示特定的字符串,一般用來標識附近另一個控件的內容。顯示在靜態文本控件中的字符串一般不再改變,但是在需要的時候,必須為其指定一個不同食物ID號,通過調用相應的函數來進行設置。MFC提供了CStatic類支持靜態控件。
顯示位圖(Bitmap)和圖標(Icon),圖形繪制與顯示,主要是其方形的區域適合顯示,同樣方形區域也可利用(Static Text)靜態文本框。
這包括水平滾動條和垂直滾動條,除了在視覺效果上的方向不同外,水平滾動條在被滾動時發生WM_HSCROLL消息,而垂直滾動條在被滾動時發送WM_VSCROLL消息。MFC提供了CScrollBar進行支持。
通常用來在程序中接受一系列離散的數值。
用戶可以設置滑塊控件的取值范圍,并可以為控件加上刻度標記以顯示特定位置的含義。
MFC提供了CSliderCtrl類進行支持。
包括一對緊靠在一起的上下箭頭,使用微調按鈕可以增大或者縮小某個特定的數值。
微調按鈕往往都需要一個“伙伴”控件,這通常都是一個編輯框。
當微調按鈕的向上箭頭被單擊時,編輯框中的數字就增大;反之則減小。MFC提供了CPinButtonCtrl類進行支持。
在進行一項需要較長時間的操作時來反應當前的進度。
當操作的進度不斷前進時,進度條就用特色顏色填充進度條框。用戶可以設定進度條的范圍和當前位置。
MFC提供了CProgressCtrl類進行支持。
CProgressCtrl* progressbar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS_1);
progressbar->SetRange(0, 4);
progressbar->SetPos(0);
熱鍵控件看起來就像一個編輯框,但是在熱鍵控件中能夠立刻反應用戶剛剛按下的鍵組合,這在設置程序的熱鍵時特別有用。
熱鍵控件只是在“視覺”上顯示了按鍵組合,設置熱鍵的工作還需要用戶添加代碼完成。
MFC提供了CHotKey類進行支持。
按一定的排列順序顯示一系列帶圖標的字符串。
列表控件提供了四種顯示模式:大圖標(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 ++;
顯示一系列項目的層次關系,最典型的例子是顯示磁盤上的文件與文件夾。
如果有子項目的話,單擊樹形控件中的項目可以展開或者收縮其子項目。
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); } }
樹節點切換
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); } }
包含大量的控件,可以滿足用戶顯示或者獲取大量數據分類顯示的要求,典型例子是Windows任務欄每個程序標簽。
每個屬性表又分為好幾個屬性頁,這些屬性頁由各自的標簽進行區分,這些屬性頁中都可以包容其他控件。
在顯示屬性表的時候,一次只能夠顯示一個屬性頁的全部內容,同時顯示其他屬性頁的標簽,用戶通過單擊標簽打開相應的屬性頁。
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; // 標簽控件客戶區的位置和大小
m_tab_Light.GetClientRect(&tabRect); // 獲取標簽控件客戶區Rect
// 調整tabRect,使其覆蓋范圍適合放置標簽頁
tabRect.left +=2;
tabRect.right -=1;
tabRect.top +=21;
tabRect.bottom -=2;
m_LightParkingDlg.Create(IDD_DIALOG_LIGHT_PARKING, &m_tab_Light); // 創建第一個標簽頁
m_LightStatusDlg.Create(IDD_DIALOG_LIGHT_STATUS, &m_tab_Light); // 創建第二個標簽頁
//m_LightParkingDlg.InitData();
m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(),SWP_SHOWWINDOW);
控件頁面切換
CRect tabRect; // 標簽控件客戶區的位置和大小
m_tab_Light.GetClientRect(&tabRect); // 獲取標簽控件客戶區Rect
// 調整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;
}
用來播放一段AVI格式的視頻剪輯。用戶可以控制視頻剪輯的播放、停止和定位,但也僅限于這些功能。動畫控件設置不能播放音頻剪輯,如果用戶需要更高層次的視頻或者音頻的支持,請選用MCIWnd控件。
MFC提供了CAnimateCtrl類對動畫控件進行支持。
編輯控件(Edit Control)功能的擴展。在高級編輯框中,除了簡單的輸入和編輯字符串外,用戶還可以為字符或段落指定特定的格式,用戶甚至還可以向高級編輯框中插入OLE項。
高級編輯框基本上實現了一個帶格式的文本編輯器功能,而只需要用戶添加少量的接口。
MFC提供了CRichEditCtrl類進行支持。
向用戶提供了一種直觀的選擇日期和時間的方法、日期/時間選擇器在外觀上類似于一個組合框,但是當用戶單擊下拉箭頭時就會展開一個日歷控件供用戶選擇,而一旦用戶做出了選擇,日期/時間選擇器會自動顯示新的日期/時間。MFC提供了CDateTimeCtrl類進行支持。
SYSTEMTIME times_1; //開始時間日期
SYSTEMTIME timee_1; //結束時間日期
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; //將時間轉換為字符串
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);
獲取系統時間
SYSTEMTIME time;
::GetLocalTime(&time);
如下圖,看似與真正的日歷類似,操作也類似,直觀的為用戶提供了觀察和顯示當前日期的途徑。MFC提供了CMonthCalCtrl類進行支持。
IP地址控件用來輸入和編輯IP地址,MFC提供了CIPAddressCtrl類進行支持。
該控件外觀類似于一個編輯框,但是可以自動對輸入的字符按3個一組進行區分和加間隔圓點。IP地址控件為開發支持Internet技術的程序提供了方便。
在普通組合框(Combo Box)的基礎上還支持圖像列表。
可以在組合框中顯示特定的圖標表示相應的選擇,而不僅僅是顯示文本。
MFC提供了CComboBoxEx類進行支持。
控件使用的時候,它的Class必須有一個類的支持這個窗口類可以VC的類,例如:Button、Edit.在頭文件增加一個CEdit類的成員變量:CEdit m_Text(即點擊右鍵添加變量),然后按照Edit控件使用即可。
1.用于在 MFC 應用程序上添加超鏈接,就像html中的超鏈接一樣。你點下可以鏈接到一個網頁上去。拖控件到頁面上,并綁定一個變量(m_linkCtrl),里面的內容全部是按照標準的html中href的用法寫的。寫錯了自然鏈接不了的。
可以去瞧下html里面的href屬性是怎/么設置的.另外要注意的是字符串中雙引號的處理(記得加個轉義符\),添加單擊響應消息
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)控件一樣,響應相應的消息
如下圖,實現多選按鈕選擇功能,使用時添加相應菜單
可以直接作為inet_addr(ip)的輸入,分隔符為逗號(,)
不僅可以為按鈕添加相應命令還可以對命令做出注解
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:表示控件不向其父窗口發送WM_PARENTNOTIFY消息。
Right aligned text:表示文本右對齊。
以上屬性可通過控件的屬性對話框進行設置,在屬性對話框中按【F1】鍵可以查看屬性的幫助信息。
每一種控件都由一個MFC控件類來管理,當通過資源編輯器在對話框上添加一個控件時,visualC++會自動為控件類生成一個實例,即對象,并調用構造函數,當對話框關閉時,其各個子控件對象被自動銷毀。
也可以不使用資源編輯器,自己在程序中寫代碼創建、顯示控件并設置控件的屬性。
所有的控件類都來自CWnd,控件的某些操作和屬性設置需要用到CWnd本身的成員函數,CWnd某些函數經常用來操縱控件和設置控件屬性。
SetWindowText:設置控件上要顯示的標題文本,即用來設置控件的caption屬性
GetWindowText:得到控件的標題文本
EnableWindow:設置控件的Disabled屬性,即社會自控件是否可以接收鍵盤和鼠標的輸入
SetWindowPos:改變窗口的大小、位置和Z軸次序。
MoveWindow:改變窗口的大小和位置
GetWindowRec:得到窗口的大小、位置(信息存放在一個矩形結構中)。
GetClientRect:得到窗口客戶區的大小(信息存放在一個矩形結構中 )
ShowWindow:設置窗口的可見性(即窗口是否可見)
SetWindowText/GetWindowText還可以用來設置/得到對話框的標題文本。
福利來啦~
學習從來不是一個人的事情,要有個相互監督的伙伴,對于C/C++感興趣可以關注小編在后臺私信我:【編程交流】一起來學習哦!可以領取一些C/C++的項目學習視頻資料哦!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。