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

曠野的呼聲

路漫漫其修遠兮 吾將上下而求索

常用鏈接

統計

最新評論

【轉帖】Visual C++中的日歷控件使用詳解

文/劉濤  前言:

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

  一、有關日歷控件的介紹

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

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

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

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

  如果要讓日歷控件顯示多個月份,按鈕的個數將通過前月或后月列表來增加或減少。例如,如果控件正在顯示4月或5月,這時用戶點擊了左邊的按鈕,控件將顯示3月或4月;如果用戶點擊了右邊的按鈕,控件將顯示5月和6月。此外,選擇當前年份中的任意一個月份,用戶可以點擊標題框中的月份名,這時候將顯示一個月份列表供用戶來選擇。具體如圖所示:

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

  如果要更改年份,用戶可以點擊年份標簽,這時候將顯示旋轉按鈕,用戶可以通過點擊旋轉按鈕的上下鍵來更改年份,也可以使用鍵盤上的上下箭頭來更改年份。

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


在標題條的下面,根據控制面板的格式顯示著星期的簡寫,在英語地區,每個星期的第一天通常是星期天。開發人員可以改變控件中的第一天設置。

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

  二、創建日歷控件

  我們可以在窗口、對話框架、工具條及其他任何容器窗口中創建日歷控件。日歷控件對應著CmonthCalCtrl類,所以要動態創建一個日歷控件,需要聲明一個CmonthCalCtrl變量或指向CmonthCalCtrl的指針,代碼如下:

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

  CmonthCalCtrl類象MFC中其他控件對應的類一樣,提供了一個Create()方法用來在容器窗口中動態創建日歷控件,代碼如下:

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
}

三、日歷控件屬性操作

  在對話框或窗口中創建一個日歷控件后,它僅顯示當前的月份并僅僅只能顯示一個月份,這是因為,按照默認的設計,控件的長、寬、高只能容納一個月的日期,如果要顯示兩個月,就要增加控件的寬度(同樣的道理,也可以通過增加高度來顯示兩個月份)。

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

COLORREF SetColor(int nRegion, COLORREF ref);


  默認情況下,控件的標題條顯示藍色背景,如果要改變它,需要向nRegion參數傳遞MCSC_TITLEBK值,向ref參數傳遞你所要顯示的顏色。如果更改標題條上文本的顏色,需要向nRegion參數傳遞MCSC_TITLETEXT值。

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


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

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


  第一個參數必須是對應的下列整數值:

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


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

int GetFirstDayOfWeek(BOOL* pbLocal = NULL) const;


  該函數返回一個整數值,它對應的含義與上個表格一致。

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

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

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

 

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

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

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


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

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
}


  我們注意到, 當前日期還被一個橢圓圈了起來,如果要將它隱藏起來,應該使用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
}


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

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


  這里有一個例子:

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);
}


為了控制用戶是否可以選擇兩個以上的日期,在創建控件時可以相應地設置多項選擇屬性。例如,如果你想讓用戶在控件中選擇一定范圍的日期,可以將多項選擇屬性設置為真。為了動態設置多日期選擇,應用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)
圖八、顯示多選擇日期的日歷控件


  通過屬性設置,用戶可以在日歷控件中選擇多個日期,當然,也可以通過動態編程來選擇多個日期,這時,可以調用CMonthCalCtrl::SetSelRange()方法,它有三個不同的版本,語法是:

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


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

  為了控制用戶可選擇的日期范圍,可以調用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);


  第一個參數nMinRange是選擇范圍的開始日期,參數nMaxRange是可供選擇的最大日期。

 

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            欧美三级日韩三级国产三级| 欧美区在线播放| 国产午夜精品美女视频明星a级| 亚洲宅男天堂在线观看无病毒| 亚洲肉体裸体xxxx137| 欧美大秀在线观看| 一区二区电影免费在线观看| 亚洲精品免费看| 国产精品久久97| 久久精品动漫| 久热精品视频在线免费观看| 在线免费观看日本一区| 亚洲国产精品成人精品| 欧美日韩一区自拍| 亚洲欧美日韩国产综合在线| 亚洲在线第一页| 在线不卡a资源高清| 最新日韩中文字幕| 国产精品久久久久久久午夜| 欧美怡红院视频| 久久香蕉国产线看观看网| 亚洲国产中文字幕在线观看| 亚洲国产精品久久久久秋霞影院 | 欧美一区激情视频在线观看| 亚洲欧美福利一区二区| 伊人久久大香线| 亚洲另类视频| 国产日产高清欧美一区二区三区| 久久久视频精品| 欧美国产欧美综合| 亚洲一二三四久久| 久久免费国产精品| 亚洲视频碰碰| 免费黄网站欧美| 欧美一区二区三区喷汁尤物| 99国内精品| 欧美一区二区私人影院日本 | 国产欧美日韩精品a在线观看| 久久久久久夜| 国产精品国产三级国产普通话99| 久久综合久色欧美综合狠狠| 欧美日韩另类国产亚洲欧美一级| 久久久噜噜噜久久中文字免| 欧美视频免费| 亚洲国产三级在线| 一区二区自拍| 欧美中文日韩| 亚洲欧美伊人| 欧美香蕉大胸在线视频观看| 欧美高清视频在线观看| 韩国成人精品a∨在线观看| 一区二区欧美日韩| 99re在线精品| 欧美成人精品在线观看| 噜噜噜在线观看免费视频日韩| 国产精品久久999| 亚洲高清色综合| 在线播放亚洲| 久久免费精品日本久久中文字幕| 欧美在线视频一区二区三区| 国产精品mv在线观看| 亚洲人成网站在线观看播放| 亚洲人成网站在线播| 久久久久久九九九九| 久久久久国产精品厨房| 国产日产亚洲精品| 午夜精品一区二区三区在线播放| 亚洲性xxxx| 国产精品久久久久久福利一牛影视| 亚洲国产精品久久久久秋霞不卡 | 国产一区二区三区不卡在线观看| 一区二区三区日韩欧美| 亚洲一区观看| 国产精品免费观看在线| 亚洲视频欧洲视频| 欧美一区二区日韩| 狠狠色狠狠色综合人人| 久久精品亚洲一区二区| 久久伊人亚洲| 亚洲激情另类| 欧美日韩国产高清视频| 99国产精品久久久久老师 | 国产午夜精品理论片a级大结局| 亚洲在线成人| 久久免费高清视频| 亚洲国产mv| 欧美日韩成人在线播放| 一区二区国产精品| 欧美中文在线观看| 在线观看91精品国产麻豆| 免费观看成人www动漫视频| 亚洲黄色片网站| 亚洲欧美久久久久一区二区三区| 国产精品免费一区二区三区在线观看 | 亚洲在线免费| 国产一区二区三区黄| 欧美1区2区3区| 亚洲无线视频| 免费成人高清在线视频| 日韩一区二区电影网| 国产精品大全| 久久久高清一区二区三区| 亚洲国产成人av在线| 午夜一区在线| 亚洲精品一区二区在线观看| 欧美午夜欧美| 久久久亚洲人| 中文国产亚洲喷潮| 裸体一区二区| 亚洲校园激情| 亚洲国产午夜| 国产精品无人区| 欧美 日韩 国产在线| 亚洲专区在线| 日韩视频精品在线观看| 久久久午夜视频| 亚洲在线观看视频| 亚洲精品在线三区| 国产自产2019最新不卡| 欧美日韩在线第一页| 久久精品最新地址| 亚洲欧美韩国| 99国产精品私拍| 欧美福利一区二区| 久久免费精品视频| 小嫩嫩精品导航| 亚洲网友自拍| 亚洲免费观看高清完整版在线观看| 国产亚洲精品久| 国产伦精品一区二区三区四区免费 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 99re6这里只有精品视频在线观看| 久久久999成人| 亚洲尤物在线视频观看| 夜夜精品视频| 亚洲欧洲在线免费| 亚洲国产精品第一区二区三区| 国产欧美91| 国产精品久久久久9999吃药| 欧美伦理一区二区| 女生裸体视频一区二区三区| 久久久999国产| 久久九九免费视频| 久久精品人人做人人爽电影蜜月 | 亚洲国产一成人久久精品| 久久久夜夜夜| 久久久久久亚洲综合影院红桃 | 一区二区三区免费看| 91久久在线视频| 亚洲精品你懂的| 亚洲精品乱码久久久久久黑人| 亚洲国产精品久久精品怡红院| 永久免费毛片在线播放不卡| 激情久久五月天| 亚洲国产天堂久久综合网| 亚洲电影自拍| 亚洲精品免费一区二区三区| 亚洲国产精品一区二区第四页av| 激情自拍一区| 一区在线影院| 亚洲国产精品一区二区三区| 亚洲国产影院| 亚洲无吗在线| 欧美中文字幕在线视频| 久久精品女人的天堂av| 毛片一区二区三区| 亚洲人体偷拍| 午夜精品福利一区二区三区av | 午夜欧美精品| 久久婷婷国产综合国色天香| 久久综合给合| 欧美三级小说| 国产一区二区三区在线观看免费视频 | 欧美日韩一区二区三区四区五区| 欧美日韩网站| 国产午夜精品久久久久久久| 在线观看中文字幕不卡| 亚洲视频成人| 久久久蜜桃精品| 亚洲第一成人在线| 亚洲一区二区三区激情| 久久久久久电影| 欧美日本二区| 国产主播在线一区| 亚洲欧洲日本一区二区三区| 中国av一区| 女女同性女同一区二区三区91| 亚洲片在线资源| 久久精品国产99精品国产亚洲性色| 女女同性精品视频| 国产日韩精品在线播放| 亚洲精品女人| 久久综合久久综合九色| 一本色道久久加勒比精品| 久久久久国色av免费观看性色| 欧美日韩在线一区二区| **性色生活片久久毛片| 午夜精品福利电影| 日韩亚洲欧美成人一区| 美国十次成人|