青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

曠野的呼聲

路漫漫其修遠(yuǎn)兮 吾將上下而求索

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

【轉(zhuǎn)帖】Visual C++中的日歷控件使用詳解

文/劉濤  前言:

  控件在Visual C++編程學(xué)習(xí)中占據(jù)很重要的位置。筆者在國(guó)外英文網(wǎng)站上看到了這篇關(guān)于日歷控件學(xué)習(xí)的文章,雖然內(nèi)容看似簡(jiǎn)單,但讀完后感覺到還是學(xué)到了一些東西。感覺到原著作者對(duì)一些不常用的日歷控制的使用方法寫的介紹的很詳細(xì),通俗易懂,于平淡之中顯神奇,是對(duì)日歷控件的"深度挖掘",對(duì)VC的初學(xué)者應(yīng)該是很有幫助的,所以就將其翻譯過來介紹給國(guó)內(nèi)讀者朋友。

  一、有關(guān)日歷控件的介紹

  Win32 API提供了一個(gè)顯示日期得當(dāng)彩色日歷控件,日期的顯示模式是基于控制面板中的區(qū)域性設(shè)置或者說是依賴于用戶的操作系統(tǒng)。具體的日歷控件如下圖一所示:

VisualC++中的日歷控件使用詳解
圖一、日歷控件顯示效果

  這個(gè)常用的日歷控件的標(biāo)題條包含兩個(gè)按鈕和兩個(gè)標(biāo)簽,左邊的按鈕準(zhǔn)許用戶單擊選擇前一個(gè)月份,左邊的標(biāo)簽顯示當(dāng)前選擇的月份,右邊的標(biāo)簽顯示當(dāng)前日期中的年份。右邊的按鈕是讓用戶選擇下一個(gè)月份。日歷控件可以配置成顯示多個(gè)月份,下圖是一具體的實(shí)例:

VisualC++中的日歷控件使用詳解
圖二、顯示多個(gè)月份的日歷控件

  如果要讓日歷控件顯示多個(gè)月份,按鈕的個(gè)數(shù)將通過前月或后月列表來增加或減少。例如,如果控件正在顯示4月或5月,這時(shí)用戶點(diǎn)擊了左邊的按鈕,控件將顯示3月或4月;如果用戶點(diǎn)擊了右邊的按鈕,控件將顯示5月和6月。此外,選擇當(dāng)前年份中的任意一個(gè)月份,用戶可以點(diǎn)擊標(biāo)題框中的月份名,這時(shí)候?qū)@示一個(gè)月份列表供用戶來選擇。具體如圖所示:

VisualC++中的日歷控件使用詳解
圖三、顯示月份列表

  如果要更改年份,用戶可以點(diǎn)擊年份標(biāo)簽,這時(shí)候?qū)@示旋轉(zhuǎn)按鈕,用戶可以通過點(diǎn)擊旋轉(zhuǎn)按鈕的上下鍵來更改年份,也可以使用鍵盤上的上下箭頭來更改年份。

VisualC++中的日歷控件使用詳解
圖四、更改日歷控件的年份


在標(biāo)題條的下面,根據(jù)控制面板的格式顯示著星期的簡(jiǎn)寫,在英語地區(qū),每個(gè)星期的第一天通常是星期天。開發(fā)人員可以改變控件中的第一天設(shè)置。

  控件上,當(dāng)前選擇的日期有一圓圈。用戶可以點(diǎn)擊欲選擇的日期來在控件上選擇一個(gè)日期。在大部分地區(qū),日期以數(shù)字的形式顯現(xiàn)在一個(gè)白色背景上(這個(gè)背景顏色乃至控件上的任何顏色可以通過程序來改變)。默認(rèn)的情況下,控件顯示一個(gè)橢圓圍繞的當(dāng)前日期。使用標(biāo)題條按鈕、月份和年份標(biāo)簽,用戶可以更改日期。如果控件顯示的不是當(dāng)前日期,用戶可以通過點(diǎn)擊控件底部顯示今天日期的標(biāo)簽來使控件顯示今天的日期。(如果你是一個(gè)程序員,可以隱藏控件底部這個(gè)顯示今日日期的標(biāo)簽)。

  二、創(chuàng)建日歷控件

  我們可以在窗口、對(duì)話框架、工具條及其他任何容器窗口中創(chuàng)建日歷控件。日歷控件對(duì)應(yīng)著CmonthCalCtrl類,所以要?jiǎng)討B(tài)創(chuàng)建一個(gè)日歷控件,需要聲明一個(gè)CmonthCalCtrl變量或指向CmonthCalCtrl的指針,代碼如下:

// Exercise1Dlg.h : header file
class CExercise1Dlg : public CDialog
{
 // Construction
 public:
  CExercise1Dlg(CWnd* pParent = NULL); // standard constructor
 private:
  CMonthCalCtrl *ctlCalendar;
};

  CmonthCalCtrl類象MFC中其他控件對(duì)應(yīng)的類一樣,提供了一個(gè)Create()方法用來在容器窗口中動(dòng)態(tài)創(chuàng)建日歷控件,代碼如下:

CExercise1Dlg::CExercise1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CExercise1Dlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CExercise1Dlg)
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 ctlCalendar = new CMonthCalCtrl;
}
/////////////////////////////////////////////////////////////////////////////
// CExercise1Dlg message handlers
BOOL CExercise1Dlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 // Set the icon for this dialog. The framework does this automatically
 // when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE); // Set big icon
 SetIcon(m_hIcon, FALSE); // Set small icon
 // TODO: Add extra initialization here
 ctlCalendar->Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER,CPoint(20, 20), this, 0x224);
 return TRUE; // return TRUE unless you set the focus to a control
}

三、日歷控件屬性操作

  在對(duì)話框或窗口中創(chuàng)建一個(gè)日歷控件后,它僅顯示當(dāng)前的月份并僅僅只能顯示一個(gè)月份,這是因?yàn)椋凑漳J(rèn)的設(shè)計(jì),控件的長(zhǎng)、寬、高只能容納一個(gè)月的日期,如果要顯示兩個(gè)月,就要增加控件的寬度(同樣的道理,也可以通過增加高度來顯示兩個(gè)月份)。

  作為一個(gè)可視化對(duì)象,日歷控件可以用不同的顏色來表現(xiàn)背景、星期日、標(biāo)題條文本、標(biāo)題條背景等。作為開發(fā)人員理所當(dāng)然地可以通過程序來更換這些顏色,當(dāng)然是要在不影響控件親合力的情況下。改變?nèi)諝v控件的顏色,需要調(diào)用CMonthCalCtrl::SetColor() 方法,該方法的語法是:

COLORREF SetColor(int nRegion, COLORREF ref);


  默認(rèn)情況下,控件的標(biāo)題條顯示藍(lán)色背景,如果要改變它,需要向nRegion參數(shù)傳遞MCSC_TITLEBK值,向ref參數(shù)傳遞你所要顯示的顏色。如果更改標(biāo)題條上文本的顏色,需要向nRegion參數(shù)傳遞MCSC_TITLETEXT值。

VisualC++中的日歷控件使用詳解(3)VisualC++中的日歷控件使用詳解(3)
圖五、更改控件的標(biāo)題條顏色


  上文說過,在標(biāo)題條的下方顯示著星期日,在英語國(guó)家,一個(gè)星期的第一天是星期天,如果你想更改一個(gè)星期的第一天,可以調(diào)用函數(shù)SetFirstDayOfWeek(),它的語法是:

BOOL SetFirstDayOfWeek(int iDay, int* lpnOld = NULL);


  第一個(gè)參數(shù)必須是對(duì)應(yīng)的下列整數(shù)值:

Value Weekday
0 Monday
1 Tuesday
2 Wednesday
3 Thursday
4 Friday
5 Saturday
6 Sunday


  如果想要獲知日歷控件的星期天中具體哪一天設(shè)置為第一天,可以調(diào)用函數(shù):GetFirstDayOfWeek(),它的語法是:

int GetFirstDayOfWeek(BOOL* pbLocal = NULL) const;


  該函數(shù)返回一個(gè)整數(shù)值,它對(duì)應(yīng)的含義與上個(gè)表格一致。

  星期日的名字使用的顏色與使用SetColor()函數(shù)傳遞MCSC_TITLETEXT時(shí)使用的顏色一致,在星期日的下面是一個(gè)水平分割線,默認(rèn)情況下它該是黑色的,但這里它卻與選擇的日期一個(gè)顏色。在分割線下是日期列表,默認(rèn)情況下背景是Windows默認(rèn)的白色,如果要改變它,需要向nRegion參數(shù)傳遞MCSC_MONTHBK值,向ref參數(shù)傳遞你所要顯示的顏色。

  表示日期的數(shù)字顯示有兩種顏色,當(dāng)前選擇的月份中的日期以黑色表示,如果要改變這種顏色,可以向需要向nRegion參數(shù)傳遞MCSC_TRAILINGTEXT值,向ref參數(shù)傳遞你所要顯示的顏色。

VisualC++中的日歷控件使用詳解(3)VisualC++中的日歷控件使用詳解(3)
圖六、更改日歷控件的日期顯示顏色

 

分割線下的日期列表以兩種顏色顯示,為了規(guī)定當(dāng)前月份中日期的顏色,可以向需要向nRegion參數(shù)傳遞MCSC_TEXT值,向ref參數(shù)傳遞你所要顯示的顏色。

  日歷控件習(xí)慣于用兩種形式來讓用戶了解當(dāng)前的日期,一是在列表中以橢圓將當(dāng)前日期圈起來,另一種方式是在底部以句子的形式顯示。在創(chuàng)建控件時(shí),將"today"屬性設(shè)置為"NO"將不顯示今天的日期。

VisualC++中的日歷控件使用詳解(4)
圖七、不顯示"今日"標(biāo)簽的日歷控件


  如上所述,默認(rèn)情況下控件顯示今天日期,可以通過編程使用MCS_NOTODAY來隱藏這個(gè)標(biāo)簽,代碼如下:

BOOL CExercise1Dlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Set the icon for this dialog. The framework does this automatically
 // when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE); // Set big icon
 SetIcon(m_hIcon, FALSE); // Set small icon

 // TODO: Add extra initialization here

 ctlCalendar->Create(WS_TABSTOP | WS_CHILD |
   WS_VISIBLE | WS_BORDER | MCS_NOTODAY,
 CPoint(20, 20), this, 0x224);

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


  我們注意到, 當(dāng)前日期還被一個(gè)橢圓圈了起來,如果要將它隱藏起來,應(yīng)該使用MCS_NOTODAYCIRCLE類型,代碼如下:

BOOL CExercise1Dlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 // Set the icon for this dialog. The framework does this automatically
 // when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE); // Set big icon
 SetIcon(m_hIcon, FALSE); // Set small icon
 // TODO: Add extra initialization here
 ctlCalendar->Create(WS_TABSTOP | WS_CHILD |
   WS_VISIBLE | WS_BORDER |
   MCS_NOTODAYCIRCLE,
 CPoint(20, 20), this, 0x224);
 return TRUE; // return TRUE unless you set the focus to a control
}


  為了獲取當(dāng)前日歷控件中選擇的日期,可以使用方法:CMonthCalCtrl::GetCurSel(),該方法重載有3個(gè)版本,它們是:

BOOL GetCurSel(COleDateTime& refDateTime) const;
BOOL GetCurSel(CTime& refDateTime) const;
BOOL GetCurSel(LPSYSTEMTIME pDateTime) const;


  這里有一個(gè)例子:

void CExercise1Dlg::OnRetrieveBtn()
{
 // TODO: Add your control notification handler code here
 UpdateData();
 CTime tme = this->m_dtpCurrent.GetCurrentTime();
 this->m_Result.Format("%s", tme.Format("%A, %B %d, %Y"));
 UpdateData(FALSE);
}


為了控制用戶是否可以選擇兩個(gè)以上的日期,在創(chuàng)建控件時(shí)可以相應(yīng)地設(shè)置多項(xiàng)選擇屬性。例如,如果你想讓用戶在控件中選擇一定范圍的日期,可以將多項(xiàng)選擇屬性設(shè)置為真。為了動(dòng)態(tài)設(shè)置多日期選擇,應(yīng)用MCS_MULTISELECT屬性,代碼如下:

BOOL CExercise1Dlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 // Set the icon for this dialog. The framework does this automatically
 // when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE); // Set big icon
 SetIcon(m_hIcon, FALSE); // Set small icon

 // TODO: Add extra initialization here

 ctlCalendar->Create(WS_TABSTOP | WS_CHILD |
    WS_VISIBLE | WS_BORDER |
    MCS_NOTODAYCIRCLE | MCS_MULTISELECT,
 CPoint(20, 20), this, 0x224);

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


VisualC++中的日歷控件使用詳解(5)
圖八、顯示多選擇日期的日歷控件


  通過屬性設(shè)置,用戶可以在日歷控件中選擇多個(gè)日期,當(dāng)然,也可以通過動(dòng)態(tài)編程來選擇多個(gè)日期,這時(shí),可以調(diào)用CMonthCalCtrl::SetSelRange()方法,它有三個(gè)不同的版本,語法是:

BOOL SetSelRange(const COleDateTime& pMinRange, const COleDateTime& pMaxRange);
BOOL SetSelRange(const CTime& pMinRange, const CTime& pMaxRange);
BOOL SetSelRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange);


  如果想獲取一個(gè)日歷控件的可選擇范圍,可以調(diào)用CMonthCalCtrl::GetSelRange() 方法。

  為了控制用戶可選擇的日期范圍,可以調(diào)用CMonthCalCtrl::SetRange()方法,它也有三中不同的形式,分別是:

BOOL SetRange(const COleDateTime* pMinRange, const COleDateTime* pMaxRange);
BOOL SetRange(const CTime* pMinRange, const CTime* pMaxRange);
BOOL SetRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange);


  第一個(gè)參數(shù)nMinRange是選擇范圍的開始日期,參數(shù)nMaxRange是可供選擇的最大日期。

 

posted on 2009-05-23 08:35 董波 閱讀(649) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久婷婷国产综合国色天香| 亚洲美女淫视频| 亚洲精品乱码久久久久久黑人| 国产精品一区一区三区| 亚洲国产毛片完整版| 国产欧美日韩亚州综合| 亚洲人成网站777色婷婷| 国内视频精品| 亚洲尤物影院| 一本大道久久a久久精品综合| 久久av二区| 欧美一区二区三区另类| 欧美精品乱码久久久久久按摩 | 国产欧美日韩视频一区二区三区| 欧美1区2区| 国内精品久久久久伊人av| 亚洲视频在线二区| 中文精品在线| 欧美日韩国产三级| 亚洲成色精品| 亚洲国产精品v| 久久国产精品亚洲va麻豆| 欧美一区二区三区在线观看视频| 国产精品久久久久9999吃药| 亚洲巨乳在线| 中文国产亚洲喷潮| 欧美日韩精品不卡| 亚洲激情自拍| 亚洲色在线视频| 欧美日韩一区二区三区在线| 99热精品在线| 性久久久久久久久久久久| 国产欧亚日韩视频| 久久国产精品色婷婷| 久久一综合视频| 亚洲国产精品传媒在线观看| 久久亚洲二区| 亚洲国产欧美日韩精品| 99ri日韩精品视频| 欧美日韩亚洲高清| 亚洲男人第一av网站| 久久精品国产v日韩v亚洲| 国产在线高清精品| 免费日韩av| 一区二区三区国产| 欧美亚洲一区二区在线| 黄色小说综合网站| 欧美国产一区二区| 一区二区三区四区五区精品| 欧美一区二区在线视频| 一区在线播放视频| 欧美日韩国产精品一区二区亚洲 | 亚洲天天影视| 久久久噜久噜久久综合| 亚洲级视频在线观看免费1级| 欧美精品一区二区在线播放| 亚洲精品一区二区三区不| 欧美一区二区三区四区在线观看| 合欧美一区二区三区| 欧美福利视频一区| 亚洲一区二区三区乱码aⅴ| 久久视频在线视频| 一区二区三区蜜桃网| 国产午夜精品麻豆| 欧美激情亚洲视频| 午夜精品福利在线观看| 免费h精品视频在线播放| 宅男66日本亚洲欧美视频| 国产一区二区久久久| 欧美韩日一区| 欧美影院精品一区| 日韩亚洲视频在线| 美女精品国产| 性欧美精品高清| 日韩亚洲在线| 黄色免费成人| 国产精品免费一区二区三区观看| 快she精品国产999| 午夜精品久久久久久久99热浪潮| 亚洲国产午夜| 美女国产一区| 久久福利毛片| 亚洲天堂久久| 亚洲靠逼com| 伊人久久亚洲影院| 国产伦精品一区二区三区四区免费| 欧美成人午夜激情在线| 性色av一区二区怡红| 一区二区动漫| 亚洲精品在线免费观看视频| 欧美成人dvd在线视频| 久久精品视频免费播放| 亚洲欧美偷拍卡通变态| 中文国产成人精品| 亚洲精品中文在线| 亚洲国产精品一区| 在线精品国精品国产尤物884a| 国产麻豆91精品| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 亚洲精品少妇网址| 欧美国产日韩精品免费观看| 久久精品网址| 久久99伊人| 欧美一区二区精美| 性欧美1819性猛交| 午夜视频在线观看一区二区三区| 一区二区三区四区国产| 亚洲卡通欧美制服中文| 亚洲国产高清aⅴ视频| 尤物网精品视频| 极品少妇一区二区| 极品尤物av久久免费看 | 亚洲人精品午夜| 亚洲国产精品悠悠久久琪琪| 好吊成人免视频| 狠狠色丁香婷综合久久| 国内精品久久久久久| 黄色av日韩| 亚洲国产精品va在线观看黑人| 亚洲第一页中文字幕| 亚洲国产精品电影| 亚洲精品日韩欧美| 亚洲天堂第二页| 亚洲综合日本| 久久久久久久欧美精品| 久色婷婷小香蕉久久| 欧美电影免费观看网站| 亚洲国产日本| 亚洲视频精品| 久久成人免费电影| 欧美 日韩 国产一区二区在线视频| 欧美成人精品在线| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 国产精品99久久久久久有的能看| 亚洲视频一区二区在线观看| 香蕉尹人综合在线观看| 久久久无码精品亚洲日韩按摩| 六月婷婷久久| 欧美日韩精品在线播放| 国产精品毛片大码女人| 黄色日韩精品| 9l国产精品久久久久麻豆| 亚洲欧美一区二区三区久久| 久久久亚洲国产美女国产盗摄| 欧美成人免费全部| 一区二区三区欧美成人| 久久精品日产第一区二区三区 | 国产伦精品一区二区三区在线观看 | 久久偷看各类wc女厕嘘嘘偷窃| 欧美激情性爽国产精品17p| 一本一本久久| 久久米奇亚洲| 欧美亚州韩日在线看免费版国语版| 国产专区欧美专区| 一区二区三区毛片| 两个人的视频www国产精品| 亚洲精品日韩精品| 欧美资源在线观看| 欧美日韩无遮挡| 亚洲国产老妈| 久久成人综合网| 亚洲精品日韩激情在线电影 | 欧美激情第9页| 国产一区二区电影在线观看| 亚洲精品久久久久久下一站 | 国产精品久久久一区麻豆最新章节 | 欧美另类99xxxxx| 黄色成人在线| 欧美夜福利tv在线| 亚洲乱码国产乱码精品精| 久久国产精品电影| 国产精品视频免费一区| 99精品视频网| 亚洲高清不卡在线观看| 久久精品动漫| 国产欧美日韩一区| 亚洲一区日韩| 91久久久久久| 免费久久99精品国产| 国内精品美女av在线播放| 亚洲欧美国产另类| 亚洲破处大片| 欧美成人精品一区| 亚洲激情在线视频| 免费日韩av电影| 欧美中文字幕久久| 国产视频一区在线观看一区免费 | 亚洲毛片播放| 欧美激情一区二区三区| 久久久久成人精品| 黑丝一区二区三区| 久久全国免费视频| 欧美影院午夜播放| 国产亚洲精品福利| 久久精品女人| 久久国产精品久久久| 韩国女主播一区| 理论片一区二区在线| 久久久免费精品视频| 亚洲高清不卡在线观看|