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

面對現(xiàn)實(shí),超越自己
逆水行舟,不進(jìn)則退
posts - 269,comments - 32,trackbacks - 0
創(chuàng)建兩種方法:
(1)常規(guī)的initWithFrame的方式 
UIButton *btn1 = [[UIButton alloc]initWithFrame:CGRectMake(100, 50, 100, 75)];

[btn1 setTitle:@"close" forState:UIControlStateNormal];
btn1.backgroundColor = [UIColor greenColor];//button的背景顏色
[btn1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];//button的背景圖片

(2)UIButton 的一個(gè)類方法(也可以說是靜態(tài)方法)buttonWithType 
UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn2.frame = CGRectMake(200, 20, 50, 60);
btn2.backgroundColor = [UIColor blackColor];
[btn2 setTitle:@"clicke" forState:UIControlStateNormal];
[self.window addSubview:btn1];
[self.window addSubview:btn2];
 
能夠定義的button類型由6種
typedef enum 

    UIButtonTypeCustom = 0,         // 自定義,無風(fēng)格 
    UIButtonTypeRoundedRect,      // 白色圓角矩形,類似偏好設(shè)置表格單元或者地址簿卡片 
    UIButtonTypeDetailDisclosure, // 藍(lán)色的披露按鈕,可放在任何文字旁 
    UIButtonTypeInfoLight,            // 微件(widget)使用的小圓圈信息按鈕,可以放在任何文字旁 
    UIButtonTypeInfoDark,            // 白色背景下使用的深色圓圈信息按鈕 
    UIButtonTypeContactAdd,       // 藍(lán)色加號(+)按鈕,可以放在任何文字旁 
} UIButtonType; 
 
[btn1 setTitle:@"BTN1" forState:UIControlStateNormal];                                                                   //設(shè)置按鈕的標(biāo)題
 
[btn1 setTitle:@"高亮狀態(tài)" forState:UIControlStateHighlighted];                                                        //高亮狀態(tài)按鈕title值

[btn2 setImage:[UIImage imageNamed:@"pic"] forState:UIControlStateNormal];                             //你也可以為按鈕的某一狀態(tài)設(shè)置為圖 

[btn1 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];                                            //設(shè)置標(biāo)題顏色 

[btn1 setTitleShadowColor:[UIColor grayColor] forState:UIControlStateNormal ];                             //陰影 

[btn1 setBackgroundImage:[UIImage imageNamed:@"PIC"] forState:UIControlStateHighlighted];  //背景圖像 

btn1.titleLabel.font = [UIFont fontWithName:@“test” size:18];                                                       //設(shè)置按鈕字體大小

[btn1 setTag:101] ;                                                                                                                            //設(shè)置tag值

btn1.layer.cornerRadius = 4.5;                                                                                                          //設(shè)置圓角——四個(gè)圓角半徑 
btn1.layer.borderWidth = 0.5;                                                                                                          // 按鈕邊框?qū)挾?/span>
                   
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();                                                   // 設(shè)置顏色空間為rgb,用于生成ColorRef
CGColorRef borderColorRef = CGColorCreate(colorSpace,(CGFloat[]){ 0, 0, 0, 1 });                        // 新建一個(gè)紅色的ColorRef,用于設(shè)置邊框(四個(gè)數(shù)字分別是 r, g, b, alpha)
btn1.layer.borderColor = borderColorRef;                                                                                        // 設(shè)置邊框顏色

更多屬性參考鏈接:http://www.cocoachina.com/wiki/index.php?title=UIButton&variant=zh-cn

參數(shù) forState . 這個(gè)參數(shù)決定了標(biāo)題、圖像或其他屬性將在何種狀態(tài)下顯現(xiàn)。你可以編程令按鈕在那個(gè)狀態(tài)變化 
enum { 
    UIControlStateNormal       = 0,                    // 常態(tài)                      
    UIControlStateHighlighted  = 1 << 0,          // 高亮 
    UIControlStateDisabled     = 1 << 1,           // 禁用 
    UIControlStateSelected     = 1 << 2,           // 選中 
    UIControlStateApplication  = 0x00FF0000,  // 當(dāng)應(yīng)用程序標(biāo)志使用時(shí) 
    UIControlStateReserved     = 0xFF000000  // 為內(nèi)部框架預(yù)留的 
}; 
typedef NSUInteger UIControlState; 
 
你只要掌握前四種狀態(tài)就好了。
當(dāng)按鈕高亮或者禁用,UIButton 類可以調(diào)整自己的外觀,下面幾個(gè)屬性可以讓你按照需要對按鈕的外觀進(jìn)行微調(diào):
adjustsImageWhenHighlighted
默認(rèn)情況下,在按鈕被禁用時(shí),圖像會被畫的顏色深一些。要禁用此功能,請將這個(gè)屬性設(shè)置為NO:
btn1.adjustsImageWhenHighlighted = NO; 

adjustsImageWhenDisabled
默認(rèn)情況下,按鈕在被禁用時(shí),圖像會被畫的顏色淡一些。要禁用此功能,請將這個(gè)屬性設(shè)置為NO:
btn1.adjustsImageWhenDisabled = NO; 

showsTouchWhenHighlighted
這個(gè)屬性設(shè)置為YES,可令按鈕在按下時(shí)發(fā)光。這可以用于信息按鈕或者有些重要的按鈕:
btn1.showsTouchWhenHighlighted = YES;
 
顯示控件
[self.view addSubview:btn1]; 
[self.view addSubview:btn2]; 
 
重寫繪制行為
 
你可以通過子類化按鈕來定制屬于你自己的按鈕類。在子類化的時(shí)候你可以重載下面這些方法,這些方法返回CGRect結(jié)構(gòu),指明了按鈕每一組成部分的邊界。
注意:不要直接調(diào)用這些方法, 這些方法是你寫給系統(tǒng)調(diào)用的。
 
backgroundRectForBounds   //指定背景邊界 
contentRectForBounds         // 指定內(nèi)容邊界 
titleRectForContentRect       // 指定文字標(biāo)題邊界  
imageRectForContentRect   //指定按鈕圖像邊界 
 
例:
- (CGRect)imageRectForContentRect:(CGRect)bounds

     return CGRectMake(0.0, 0.0, 44, 44); 

 
[btn1 addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];//添加點(diǎn)擊按鈕事件
 
-(void)btnPressed:(id)sender
{  
      UIButton* btn = (UIButton*)sender;  
      //開始寫你自己的動作 
}

forControlEvents參數(shù)類型
 typedef NS_OPTIONS(NSUInteger, UIControlEvents) 
{
    UIControlEventTouchDown                 = 1 <<  0,      // 單點(diǎn)觸摸按下事件:用戶點(diǎn)觸屏幕,或者又有新手指落下的時(shí)候。
    UIControlEventTouchDownRepeat      = 1 <<  1,      // 多點(diǎn)觸摸按下事件,點(diǎn)觸計(jì)數(shù)大于1:用戶按下第二、三、或第四根手指的時(shí)候。
    UIControlEventTouchDragInside         = 1 <<  2,      // 當(dāng)一次觸摸在控件窗口內(nèi)拖動時(shí)。
    UIControlEventTouchDragOutside       = 1 <<  3,      // 當(dāng)一次觸摸在控件窗口之外拖動時(shí)。
    UIControlEventTouchDragEnter           = 1 <<  4,      // 當(dāng)一次觸摸從控件窗口之外拖動到內(nèi)部時(shí)
    UIControlEventTouchDragExit             = 1 <<  5,      // 當(dāng)一次觸摸從控件窗口內(nèi)部拖動到外部時(shí)。
    UIControlEventTouchUpInside            = 1 <<  6,      // 所有在控件之內(nèi)觸摸抬起事件
    UIControlEventTouchUpOutside          = 1 <<  7,      // 所有在控件之外觸摸抬起事件(點(diǎn)觸必須開始與控件內(nèi)部才會發(fā)送通知)。
    UIControlEventTouchCancel                = 1 <<  8,      //所有觸摸取消事件,即一次觸摸因?yàn)榉派狭颂嗍种付蝗∠蛘弑簧湘i或者電話呼叫打斷。

    UIControlEventValueChanged             = 1 << 12,     // 當(dāng)控件的值發(fā)生改變時(shí),發(fā)送通知。用于滑塊、分段控件、以及其他取值的控件。你可以配置滑塊控件何時(shí)發(fā)送通知,在滑塊被放下時(shí)發(fā)送,或者在被拖動時(shí)發(fā)送。

    UIControlEventEditingDidBegin           = 1 << 16,     // 當(dāng)文本控件中開始編輯時(shí)發(fā)送通知
    UIControlEventEditingChanged           = 1 << 17,     // 當(dāng)文本控件中的文本被改變時(shí)發(fā)送通知。
    UIControlEventEditingDidEnd              = 1 << 18,     // 當(dāng)文本控件中編輯結(jié)束時(shí)發(fā)送通知。
    UIControlEventEditingDidEndOnExit    = 1 << 19,     // 當(dāng)文本控件內(nèi)通過按下回車鍵(或等價(jià)行為)結(jié)束編輯時(shí),發(fā)送通知。

    UIControlEventAllTouchEvents             = 0x00000FFF,  // 通知所有觸摸事件。
    UIControlEventAllEditingEvents           = 0x000F0000,  // 通知所有關(guān)于文本編輯的事件。
    UIControlEventApplicationReserved    = 0x0F000000,  // range available for application use
    UIControlEventSystemReserved          = 0xF0000000,  // range reserved for internal framework use
    UIControlEventAllEvents                      = 0xFFFFFFFF   // 通知所有事件
}; 
posted @ 2014-07-15 13:37 王海光 閱讀(6321) | 評論 (0)編輯 收藏
//手動定義一個(gè)UITextField 及其基本的屬性:
 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(202013030)];
 
//設(shè)置邊框樣式,只有設(shè)置了才會顯示邊框樣式 
text.borderStyle = UITextBorderStyleRoundedRect;
typedef 
enum 
{
    UITextBorderStyleNone, 
    UITextBorderStyleLine,
    UITextBorderStyleBezel,
    UITextBorderStyleRoundedRect  
  } UITextBorderStyle;
 
text.backgroundColor 
= [UIColor whiteColor];                             //設(shè)置輸入框的背景顏色,此時(shí)設(shè)置為白色 如果使用了自定義的背景圖片邊框會被忽略掉 
text.background = [UIImage imageNamed:@"dd.png"];              //設(shè)置背景
text.disabledBackground = [UIImage imageNamed:@"cc.png"]; //設(shè)置背景
text.placeholder = @"password";                                                //當(dāng)輸入框沒有內(nèi)容時(shí),水印提示 提示內(nèi)容為password
text.font = [UIFont fontWithName:@"Arial" size:20.0f];              //設(shè)置輸入框內(nèi)容的字體樣式和大小
text.textColor = [UIColor redColor];                                            //設(shè)置字體顏色
text.clearButtonMode = UITextFieldViewModeAlways;                //輸入框中是否有個(gè)叉號,在什么時(shí)候顯示,用于一次性刪除輸入框中的內(nèi)容

typedef 
enum 
{
    UITextFieldViewModeNever,            
//重不出現(xiàn)
    UITextFieldViewModeWhileEditing,    
//編輯時(shí)出現(xiàn)
    UITextFieldViewModeUnlessEditing,  
// 除了編輯外都出現(xiàn)
    UITextFieldViewModeAlways           
//一直出現(xiàn) 
} UITextFieldViewMode;

text.text = @"一開始就在輸入框的文字";   //輸入框中一開始就有的文字
text.secureTextEntry = YES;                 //每輸入一個(gè)字符就變成點(diǎn) 用語密碼輸入
text.autocorrectionType = UITextAutocorrectionTypeNo;//是否糾錯(cuò)
 
typedef enum 
{

    UITextAutocorrectionTypeDefault,  // 默認(rèn)
    UITextAutocorrectionTypeNo,       //不自動糾錯(cuò)
    UITextAutocorrectionTypeYes,      //自動糾錯(cuò)
} UITextAutocorrectionType;

text.clearsOnBeginEditing = YES;                            //再次編輯就清空
text.textAlignment = UITextAlignmentLeft;              //內(nèi)容對齊方式
text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;//內(nèi)容的垂直對齊方式  UITextField繼承自UIControl,此類中有一個(gè)屬性contentVerticalAlignment
textFied.adjustsFontSizeToFitWidth = YES;             //設(shè)置為YES時(shí)文本會自動縮小以適應(yīng)文本窗口大小.默認(rèn)是保持原來大小,而讓長文本滾動 
text.minimumFontSize = 20;                                    //設(shè)置自動縮小顯示的最小字體大小
text.keyboardType = UIKeyboardTypeNumberPad; //設(shè)置鍵盤的樣式
 
typedef 
enum 
{
    UIKeyboardTypeDefault,                             默認(rèn)鍵盤,支持所有字符
    UIKeyboardTypeASCIICapable,                  支持ASCII的默認(rèn)鍵盤
    UIKeyboardTypeNumbersAndPunctuation, 標(biāo)準(zhǔn)電話鍵盤,支持+*#字符
    UIKeyboardTypeURL,                                    URL鍵盤,支持.com按鈕 只支持URL字符
UIKeyboardTypeNumberPad,                          數(shù)字鍵盤
UIKeyboardTypePhonePad,                          電話鍵盤
    UIKeyboardTypeNamePhonePad,               電話鍵盤,也支持輸入人名
UIKeyboardTypeEmailAddress,                       用于輸入電子 郵件地址的鍵盤     
UIKeyboardTypeDecimalPad,                          數(shù)字鍵盤 有數(shù)字和小數(shù)點(diǎn)
    UIKeyboardTypeTwitter,                             優(yōu)化的鍵盤,方便輸入@、#字符
    
UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, 
} UIKeyboardType;
 
text.autocapitalizationType 
= UITextAutocapitalizationTypeNone;//首字母是否大寫
 
typedef 
enum 
{
    UITextAutocapitalizationTypeNone,              不自動大寫
    UITextAutocapitalizationTypeWords,          單詞首字母大寫
    UITextAutocapitalizationTypeSentences,    句子的首字母大寫
    UITextAutocapitalizationTypeAllCharacters,  所有字母都大寫 
} UITextAutocapitalizationType;

 text.returnKeyType =UIReturnKeyDone;//return鍵變成什么鍵
typedef enum 
{
    UIReturnKeyDefault,              默認(rèn) 灰色按鈕,標(biāo)有Return
    UIReturnKeyGo,                   標(biāo)有Go的藍(lán)色按鈕
    UIReturnKeyGoogle,              標(biāo)有Google的藍(lán)色按鈕,用語搜索
    UIReturnKeyJoin,                   標(biāo)有Join的藍(lán)色按鈕
    UIReturnKeyNext,                  標(biāo)有Next的藍(lán)色按鈕
    UIReturnKeyRoute,                標(biāo)有Route的藍(lán)色按鈕
    UIReturnKeySearch,              標(biāo)有Search的藍(lán)色按鈕
    UIReturnKeySend,                 標(biāo)有Send的藍(lán)色按鈕
    UIReturnKeyYahoo,               標(biāo)有Yahoo的藍(lán)色按鈕
    UIReturnKeyYahoo,               標(biāo)有Yahoo的藍(lán)色按鈕
    UIReturnKeyEmergencyCall,  緊急呼叫按鈕 
} UIReturnKeyType;

textView.keyboardAppearance=UIKeyboardAppearanceDefault;//鍵盤外觀
typedef enum 
{
UIKeyboardAppearanceDefault,   默認(rèn)外觀,淺灰色
UIKeyboardAppearanceAlert,   深灰 石墨色
} UIReturnKeyType;

text.delegate = self;//設(shè)置代理 用于實(shí)現(xiàn)協(xié)議
[self.window addSubview:text];//把textfield加到視圖中
 
//最右側(cè)加圖片是以下代碼  左側(cè)類似
 UIImageView *image=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]];
 text.rightView
=image;
 text.rightViewMode 
= UITextFieldViewModeAlways; 
 
typedef 
enum 
{
    UITextFieldViewModeNever,
    UITextFieldViewModeWhileEditing,
    UITextFieldViewModeUnlessEditing,
    UITextFieldViewModeAlways
} UITextFieldViewMode;
 
//按return鍵鍵盤往下收  becomeFirstResponder
 
類要采用UITextFieldDelegate協(xié)議
text.
delegate = self; 聲明text的代理是我,我會去實(shí)現(xiàn)把鍵盤往下收的方法 這個(gè)方法在UITextFieldDelegate里所以我們要采用UITextFieldDelegate這個(gè)協(xié)議
 
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [text resignFirstResponder];    
//主要是[receiver resignFirstResponder]在哪調(diào)用就能把receiver對應(yīng)的鍵盤往下收
    return YES;
}
重寫繪制行為
除了UITextField對象的風(fēng)格選項(xiàng),你還可以定制化UITextField對象,為他添加許多不同的重寫方法,來改變文本字段的顯示行為。這些方法都會返回一個(gè)CGRect結(jié)構(gòu),制定了文本字段每個(gè)部件的邊界范圍。以下方法都可以重寫。
 
– textRectForBounds:         
//重寫來重置文字區(qū)域
– drawTextInRect:              //改變繪文字屬性.重寫時(shí)調(diào)用super可以按默認(rèn)圖形屬性繪制,若自己完全重寫繪制函數(shù),就不用調(diào)用super了.
– placeholderRectForBounds:   //重寫來重置占位符區(qū)域
– drawPlaceholderInRect:    //重寫改變繪制占位符屬性.重寫時(shí)調(diào)用super可以按默認(rèn)圖形屬性繪制,若自己完全重寫繪制函數(shù),就不用調(diào)用super了.
– borderRectForBounds:      //重寫來重置邊緣區(qū)域
– editingRectForBounds:      //重寫來重置編輯區(qū)域
– clearButtonRectForBounds: //重寫來重置clearButton位置,改變size可能導(dǎo)致button的圖片失真
– leftViewRectForBounds:
– rightViewRectForBounds:
 
委托方法
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
      
//返回一個(gè)BOOL值,指定是否循序文本字段開始編輯  
      return YES; 
} 
 
- (void)textFieldDidBeginEditing:(UITextField *)textField
{ 
       
//開始編輯時(shí)觸發(fā),文本字段將成為first responder 
} 
 
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{ 
      
//返回BOOL值,指定是否允許文本字段結(jié)束編輯,當(dāng)編輯結(jié)束,文本字段會讓出first responder 
    
//要想在用戶結(jié)束編輯時(shí)阻止文本字段消失,可以返回NO 
    
//這對一些文本字段必須始終保持活躍狀態(tài)的程序很有用,比如即時(shí)消息 
  
    
return NO; 
} 
 
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{ 
      
//當(dāng)用戶使用自動更正功能,把輸入的文字修改為推薦的文字時(shí),就會調(diào)用這個(gè)方法。 
      
//這對于想要加入撤銷選項(xiàng)的應(yīng)用程序特別有用 
      
//可以跟蹤字段內(nèi)所做的最后一次修改,也可以對所有編輯做日志記錄,用作審計(jì)用途。   
      
//要防止文字被改變可以返回NO 
      
//這個(gè)方法的參數(shù)中有一個(gè)NSRange對象,指明了被改變文字的位置,建議修改的文本也在其中 
 
    
return YES; 
} 
 
- (BOOL)textFieldShouldClear:(UITextField *)textField
{ 
      
//返回一個(gè)BOOL值指明是否允許根據(jù)用戶請求清除內(nèi)容 
      
//可以設(shè)置在特定條件下才允許清除內(nèi)容 
 
    
return YES; 
} 
 
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{ 
      
//返回一個(gè)BOOL值,指明是否允許在按下回車鍵時(shí)結(jié)束編輯 
       
//如果允許要調(diào)用resignFirstResponder 方法,這回導(dǎo)致結(jié)束編輯,而鍵盤會被收起[textField resignFirstResponder];
      
//查一下resign這個(gè)單詞的意思就明白這個(gè)方法了 
    return YES; 
} 
 
通知
UITextField派生自UIControl,所以UIControl類中的通知系統(tǒng)在文本字段中也可以使用。除了UIControl類的標(biāo)準(zhǔn)事件,你還可以使用下列UITextField類特有的事件
 
UITextFieldTextDidBeginEditingNotification
UITextFieldTextDidChangeNotification
UITextFieldTextDidEndEditingNotification
當(dāng)文本字段退出編輯模式時(shí)觸發(fā)。通知的object屬性存儲了最終文本。
 
因?yàn)槲谋咀侄我褂面I盤輸入文字,所以下面這些事件發(fā)生時(shí),也會發(fā)送動作通知
UIKeyboardWillShowNotification  
//鍵盤顯示之前發(fā)送
UIKeyboardDidShowNotification   //鍵盤顯示之后發(fā)送
UIKeyboardWillHideNotification    //鍵盤隱藏之前發(fā)送
UIKeyboardDidHideNotification    //鍵盤隱藏之后發(fā)送
1、Text :設(shè)置文本框的默認(rèn)文本。
2、Placeholder : 可以在文本框中顯示灰色的字,用于提示用戶應(yīng)該在這個(gè)文本框輸入什么內(nèi)容。當(dāng)這個(gè)文本框中輸入了數(shù)據(jù)時(shí),用于提示的灰色的字將會自動消失。
3、Background :
4、Disabled : 若選中此項(xiàng),用戶將不能更改文本框內(nèi)容。
5、接下來是三個(gè)按鈕,用來設(shè)置對齊方式。
6、Border Style : 選擇邊界風(fēng)格。
7、Clear Button : 這是一個(gè)下拉菜單,你可以選擇清除按鈕什么時(shí)候出現(xiàn),所謂清除按鈕就是出一個(gè)現(xiàn)在文本框右邊的小 X ,你可以有以下選擇:
    7.1 Never appears : 從不出現(xiàn)
    7.2 Appears while editing : 編輯時(shí)出現(xiàn)
    7.3 Appears unless editing : 
    7.4 Is always visible : 總是可見
8、Clear when editing begins : 若選中此項(xiàng),則當(dāng)開始編輯這個(gè)文本框時(shí),文本框中之前的內(nèi)容會被清除掉。比如,你現(xiàn)在這個(gè)文本框 A 中輸入了 "What" ,之后去編輯文本框 B,若再回來編輯文本框 A ,則其中的 "What" 會被立即清除。
9、Text Color : 設(shè)置文本框中文本的顏色。
10、Font : 設(shè)置文本的字體與字號。
11、Min Font Size : 設(shè)置文本框可以顯示的最小字體(不過我感覺沒什么用)
12、Adjust To Fit : 指定當(dāng)文本框尺寸減小時(shí),文本框中的文本是否也要縮小。選擇它,可以使得全部文本都可見,即使文本很長。但是這個(gè)選項(xiàng)要跟 Min Font Size 配合使用,文本再縮小,也不會小于設(shè)定的 Min Font Size 。
接下來的部分用于設(shè)置鍵盤如何顯示。
13、Captitalization : 設(shè)置大寫。下拉菜單中有四個(gè)選項(xiàng):
    13.1 None : 不設(shè)置大寫
    13.2 Words : 每個(gè)單詞首字母大寫,這里的單詞指的是以空格分開的字符串
    13.3 Sentances : 每個(gè)句子的第一個(gè)字母大寫,這里的句子是以句號加空格分開的字符串
    13.4 All Characters : 所以字母大寫
14、Correction : 檢查拼寫,默認(rèn)是 YES 。
15、Keyboard : 選擇鍵盤類型,比如全數(shù)字、字母和數(shù)字等。
16、Appearance:
17、Return Key : 選擇返回鍵,可以選擇 Search 、 Return 、 Done 等。
18、Auto-enable Return Key : 如選擇此項(xiàng),則只有至少在文本框輸入一個(gè)字符后鍵盤的返回鍵才有效。
19、Secure : 當(dāng)你的文本框用作密碼輸入框時(shí),可以選擇這個(gè)選項(xiàng),此時(shí),字符顯示為星號。
 
1.Alignment Horizontal 水平對齊方式
2.Alignment Vertical 垂直對齊方式
3.用于返回一個(gè)BOOL值 輸入框是否 Selected(選中) Enabled(可用) Highlighted(高亮)
 
限制只能輸入特定的字符
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet 
*cs;
    cs 
= [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet];
 
    NSString 
*filtered = [[string componentsSeparatedByCharactersInSet:cs]componentsJoinedByString:@""]; //按cs分離出數(shù)組,數(shù)組按@""分離出字符串
 
    BOOL canChange 
= [string isEqualToString:filtered];
 
    
return canChange;
}
 
上面那個(gè)NUMBERS是一個(gè)宏,可以在文件頂部定義:
#define NUMBERS @”0123456789n” (這個(gè)代表可以輸入數(shù)字和換行,請注意這個(gè)n,如果不寫這個(gè),Done按鍵將不會觸發(fā),如果用在SearchBar中,將會不觸發(fā)Search事件,因?yàn)槟阕约合拗撇蛔屳斎雗,好慘,我在項(xiàng)目中才發(fā)現(xiàn)的。)
所以,如果你要限制輸入英文和數(shù)字的話,就可以把這個(gè)定義為:
#define kAlphaNum   @”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″。
當(dāng)然,你還可以在以上方法return之前,做一提示的,比如提示用戶只能輸入數(shù)字之類的。如果你覺得有需要的話。
 
限制只能輸入一定長度的字符
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{ 
      
//string就是此時(shí)輸入的那個(gè)字符 textField就是此時(shí)正在輸入的那個(gè)輸入框 返回YES就是可以改變輸入框的值 NO相反
      
if ([string isEqualToString:@"n"]) //按會車可以改變
      { 
           
return YES; 
      } 
      NSString 
* toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; //得到輸入框的內(nèi)容
 
      
if (self.myTextField == textField) //判斷是否時(shí)我們想要限定的那個(gè)輸入框
      { 
          
if ([toBeString length] > 20
          { 
               
//如果輸入框內(nèi)容大于20則彈出警告
               textField.text = [toBeString substringToIndex:20]; 
               UIAlertView 
*alert = [[[UIAlertView alloc] initWithTitle:nil message:@"超過最大字?jǐn)?shù)不能輸入了" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] autorelease]; 
               [alert show]; 
               
return NO; 
          } 
      }
 
    
return YES; 
}

本文轉(zhuǎn)自:
http://www.3lian.com/edu/2012/11-08/43227.html
posted @ 2014-07-15 11:02 王海光 閱讀(1442) | 評論 (0)編輯 收藏
1、根據(jù)年、月、日獲取星期幾
- (int)getWeekdayFromDate:(int)nYead andMonth:(int)nMonth andDay:(int)nDay
{
    NSDateComponents *_comps = [[NSDateComponents alloc] init];
    [_comps setDay:nDay];
    [_comps setMonth:nMonth];
    [_comps setYear:nYead];
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *_date = [gregorian dateFromComponents:_comps];
    NSDateComponents *weekdayComponents =
    [gregorian components:NSWeekdayCalendarUnit fromDate:_date];
    int _weekday = [weekdayComponents weekday];
    
    return _weekday;
}
- (NSUInteger)getWeekdayFromDate:(NSDate*)date
{
    NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
    NSDateComponents* components = [[[NSDateComponents alloc] init] autorelease]; 
    NSInteger unitFlags = NSYearCalendarUnit | 
                          NSMonthCalendarUnit | 
                          NSDayCalendarUnit | 
                          NSWeekdayCalendarUnit | 
                          NSHourCalendarUnit | 
                          NSMinuteCalendarUnit | 
                          NSSecondCalendarUnit; 

    components = [calendar components:unitFlags fromDate:date];
    NSUInteger weekday = [components weekday]; 
    return weekday;
}

2、根據(jù)月和日獲取星座
-(NSString *)getAstroWithMonth:(int)m day:(int)d
{ 
    NSString *astroString = @"魔羯水瓶雙魚白羊金牛雙子巨蟹獅子處女天秤天蝎射手魔羯";
    NSString *astroFormat = @"102123444543";
    NSString *result; 
    if (m < 1 || m > 12 || d < 1 || d > 31)
    {
        return @"錯(cuò)誤日期格式!";
    }  
    if(m == 2 && d > 29)
    {
        return @"錯(cuò)誤日期格式!!";
    }
    else if(m == 4 || m == 6 || m == 9 || m == 11)
    {
        if (d > 30)
        {
            return @"錯(cuò)誤日期格式!!!";
        }
    }
    
    result = [NSString stringWithFormat:@"%@",[astroString substringWithRange:NSMakeRange(m*2 - (d < [[astroFormat substringWithRange:NSMakeRange((m - 1), 1)] intValue] - (-19))*2, 2)]];
    
    return result;
}

3、計(jì)算兩個(gè)日期之間相差幾天幾小時(shí)幾分鐘
NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
   [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
   NSDate *  senddate=[NSDate date];
   //結(jié)束時(shí)間
   NSDate *endDate = [dateFormatter dateFromString:@"2014-6-24 00:00:00"];
   //當(dāng)前時(shí)間
   NSDate *senderDate = [dateFormatter dateFromString:[dateFormatter stringFromDate:senddate]];
   //得到相差秒數(shù)
   NSTimeInterval time=[endDate timeIntervalSinceDate:senderDate];
    
   int days = ((int)time)/(3600*24);
   int hours = ((int)time)%(3600*24)/3600;
   int minute = ((int)time)%(3600*24)600/60;
   
   if (days <= 0&&hours; <= 0&&minute; <= 0)
       dateContent=@"0天0小時(shí)0分鐘";
   else
       dateContent=[[NSString alloc] initWithFormat:@"%i天%i小時(shí)%i分鐘",days,hours,minute];

4、獲取當(dāng)前時(shí)間
NSDate *now = [NSDate date];
NSLog(@”now date is: %@”, now);

NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:now];
    
int year = [dateComponent year];
int month = [dateComponent month];
int day = [dateComponent day];
int hour = [dateComponent hour];
int minute = [dateComponent minute];
int second = [dateComponent second];

NSLog(@”year is: %d”, year);
NSLog(@”month is: %d”, month);
NSLog(@”day is: %d”, day);
NSLog(@”hour is: %d”, hour);
NSLog(@”minute is: %d”, minute);
NSLog(@”second is: %d”, second);

注:根據(jù)互聯(lián)網(wǎng)資料整理
posted @ 2014-07-15 10:43 王海光 閱讀(332) | 評論 (0)編輯 收藏

在iOS應(yīng)用開發(fā)中,有三類視圖對象會打開虛擬鍵盤,進(jìn)行輸入操作,但如何關(guān)閉虛擬鍵盤,卻沒有提供自動化的方法。這個(gè)需要我們自己去實(shí)現(xiàn)。這三類視圖對象分別是UITextField,UITextView和UISearchBar。
這里介紹一下UITextField中關(guān)閉虛擬鍵盤的幾種方法。

 

(原文鏈接: http://mikixiyou.iteye.com/blog/1753330 )


第一種方法,使用它的委托UITextFieldDelegate中的方法textFieldShouldReturn:來關(guān)閉虛擬鍵盤。
在UITextField視圖對象如birdNameInput所在的類中實(shí)現(xiàn)這個(gè)方法。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {  
    if ((textField == self.birdNameInput) || (textField == self.locationInput)) {  
        [textField resignFirstResponder];  
    }  
    return YES;  

 這樣,在輸入框birdNameInput中打開虛擬鍵盤后,輕擊鍵盤的return鍵就會自動關(guān)閉掉虛擬鍵盤。


第二種方法,將birdNameInput的屬性中Return Key修改為done,再定義一個(gè)方法和Done鍵的Did End On Exit連接。通過輕擊done鍵觸發(fā)這個(gè)事件來關(guān)閉虛擬鍵盤。
定義的方法如下:

- (IBAction) textFieldDoneEditing:(id)sender  
{  
        [sender resignFirstResponder];  
 

這兩個(gè)方法都是輕擊虛擬鍵盤上一個(gè)鍵來關(guān)閉它。這屬于精確操作,而手指不像鼠標(biāo),做這種操作不容易。因此就UI層面而言,這兩個(gè)方法都不是最好的方法。
在iphone或ipad屏幕上,虛擬鍵盤占用的面積大小是有限的。通過輕擊虛擬鍵盤之外的區(qū)域而關(guān)閉虛擬鍵盤。

 

第三種方法,通過輕擊鍵盤之外的空白區(qū)域關(guān)閉虛擬鍵盤。
在birdNameInput所屬的視圖控制器類的viewDidLoad方法中定義一個(gè)UITapGestureRecognizer的對象,然后將它賦值為它的視圖。

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]   initWithTarget:self action:@selector(dismissKeyboard)];  
[self.view addGestureRecognizer:tap];  
[tap release]; 


再定義一下選擇器調(diào)用的方法dismissKeyboard。

-(void)dismissKeyboard {  
       [birdNameInput resignFirstResponder];  


如果屏幕上有多個(gè)textField的話,一個(gè)一個(gè)地列出來就有些麻煩。那么將方法修改一下,如下:

-(void)dismissKeyboard {  
    NSArray *subviews = [self.view subviews];  
    for (id objInput in subviews) {  
        if ([objInput isKindOfClass:[UITextField class]]) {  
            UITextField *theTextField = objInput;  
            if ([objInput isFirstResponder]) {  
                [theTextField resignFirstResponder];  
            }  
        }  
    }  
}

如果這個(gè)屏幕上的視圖對象很復(fù)雜的話,另當(dāng)別論。
這個(gè)方法是編碼新建一個(gè)手勢對象。也可以直接使用interface builder圖形化開發(fā)工具,在storyboard中拉入一個(gè)手勢對象到視圖控制器類中,再將此手勢對象建立一個(gè)IBACTION,名稱可以是dismissKeyboard。

第四種方法,通過輕擊鍵盤之外的空白區(qū)域關(guān)閉虛擬鍵盤。
將屏幕上的view也就是textField的父視圖拖一個(gè)touch down事件出來,和一個(gè)能關(guān)閉虛擬鍵盤的方法連接。如果視圖沒有touch down事件,可將view的父類從UIView修改為UIButton。
首先定義并實(shí)現(xiàn)一個(gè)方法backgroundTap:。

 - (IBAction) backgroundTap:(id)sender  
{  
        NSArray *subviews = [self.view subviews];  
    for (id objInput in subviews) {  
        if ([objInput isKindOfClass:[UITextField class]]) {  
            UITextField *theTextField = objInput;  
            if ([objInput isFirstResponder]) {  
                [theTextField resignFirstResponder];  
            }  
        }  
    }  
}

然后選擇背景視圖的Touch Down事件,連接 backgroundTap:即可。這樣只要輕擊一下虛擬鍵盤之外的區(qū)域,就能關(guān)閉虛擬鍵盤。這些方法都是使用resignFirstResponder方法來關(guān)閉虛擬鍵盤,還有其他的方法。

 

第五種方法,使用endEditing:方法
在所在的視圖控制器類中,覆蓋這個(gè)方法。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
      [[self view] endEditing:YES];  
}

 

This method looks at the current view and its subview hierarchy for the text field that is currently the first responder. If it finds one, it asks that text field to resign as first responder. If the force parameter is set to YES, the text field is never even asked; it is forced to resign.
但是,如果這個(gè)屏幕很復(fù)雜,虛擬鍵盤之外的區(qū)域中有很多按鈕。輕擊這些區(qū)域時(shí)可能會輕擊到這些按鈕,這樣虛擬鍵盤就不能關(guān)閉。
要是找到一個(gè)沒有按鈕的空白區(qū)域都不容易且還有隱藏的視圖對象時(shí),通過輕擊虛擬鍵盤之外的區(qū)域關(guān)閉虛擬鍵盤的方法實(shí)現(xiàn)起來就難了。

 

第六種方法,覆蓋hitTest:withEvent:方法關(guān)閉虛擬鍵盤

 

在stackoverflow.com上,有人這樣總結(jié)。說使用hitTest:withEvent:方法是最好的,也是最容易的解決方法。

 

I think the easiest (and best) way to do this is to subclass your global view and use hitTest:withEvent method to listen to any touch. 
Touches on keyboard aren't registered, so hitTest:withEvent is only called when you touch/scroll/swipe/pinch... somewhere else, then call [self endEditing:YES].
This is better than using touchesBegan because touchesBegan are not called if you click on a button on top of the view. 
It is better than UITapGestureRecognizer which can't recognize a scrolling gesture for example. It is also better than using a dim screen because in a complexe and dynamic user interface, you can't put dim screen every where. Moreover, it doesn't block other actions, you don't need to tap twice to select a button outside (like in the case of a UIPopover).
Also, it's better than calling [textField resignFirstResponder], because you may have many text fields on screen, so this works for all of them.

 

因此,我再建立一個(gè)繼承UIView的視圖類。在這個(gè)視圖類中,覆蓋hitTest:withEvent:方法,增加[self endEditing:YES]方法。

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {  
UIView *result = [super hitTest:point withEvent:event];  
[self endEditing:YES]  
return result;  

我將視圖控制器的主視圖所屬類修改為這個(gè)新建視圖類。這樣在屏幕上輕擊任何位置都會關(guān)閉虛擬鍵盤。
這個(gè)方法是最簡單,也是最好的關(guān)閉虛擬鍵盤的方法。
使用好hitTest:withEvent:這個(gè)方法,還可以實(shí)現(xiàn)很多很復(fù)雜的功能。
The implementation of hitTest:withEvent: in UIResponder does the following:

  •     It calls pointInside:withEvent: of self
  •     If the return is NO, hitTest:withEvent: returns nil. the end of the story.
  •     If the return is YES, it sends hitTest:withEvent: messages to its subviews. it starts from the top-level subview, and continues to other views until a subview returns a non-nil object, or all subviews receive the message.
  •     If a subview returns a non-nil object in the first time, the first hitTest:withEvent: returns that object. the end of the story.
  •     If no subview returns a non-nil object, the first hitTest:withEvent: returns self

This process repeats recursively, so normally the leaf view of the view hierarchy is returned eventually.
However, you might override hitTest:withEvent to do something differently. In many cases, overriding pointInside:withEvent: is simpler and still provides enough options to tweak event handling in your application.

posted @ 2014-06-23 13:54 王海光 閱讀(354) | 評論 (0)編輯 收藏
     摘要:       IOS開發(fā)使用委托delegate在不同窗口之間傳遞數(shù)據(jù)是本文要介紹的內(nèi)容,主要是來講解如何使用委托delegate在不同窗口之間傳遞數(shù)據(jù),具體內(nèi)容來看詳細(xì)內(nèi)容。在IOS開發(fā)里兩個(gè)UIView窗口之間傳遞參數(shù)方法有很多,比如 1、使用SharedApplication,定義一個(gè)變量來傳遞. 2、使用文件,或者NSUserdefaul...  閱讀全文
posted @ 2014-06-18 14:50 王海光 閱讀(381) | 評論 (0)編輯 收藏
1、設(shè)置背景圖片
1     UIImageView *imgView =[[UIImageView alloc] initWithFrame:CGRectMake(128, 80,64,64)];
2     imgView.image = [UIImage imageNamed:@"portrait.png"];
3     imgView.userInteractionEnabled=YES;
4     UITapGestureRecognizer *singleTap =[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(onClickPortraitImage)];
5     [imgView addGestureRecognizer:singleTap];
6     [self.view addSubview:imgView];

2、響應(yīng)點(diǎn)擊事件
1 -(void)onClickPortraitImage{
2     
3     NSLog(@"圖片被點(diǎn)擊!");
4 }

開發(fā)工具Xcode5 系統(tǒng)版本:OS X 10. 9. 3 ( 13D65 )
posted @ 2014-05-28 14:33 王海光 閱讀(369) | 評論 (0)編輯 收藏

鼠標(biāo)滾輪消息似乎只會發(fā)給當(dāng)前獲得焦點(diǎn)的窗口,所以當(dāng)子窗體沒有焦點(diǎn)時(shí)是收不到滾輪消息的,收到消息的可能是父窗口。

解決:添加鼠標(biāo)單擊相應(yīng)函數(shù),在響應(yīng)函數(shù)中添加SetFoucs();一句,這樣強(qiáng)制設(shè)置焦點(diǎn)給子窗口,然后再滾動鼠標(biāo)滾輪,子窗體就能收到滾輪消息了。

 

問題繼續(xù),當(dāng)子窗口上有其他可以獲得焦點(diǎn)的控件時(shí),比如下拉列表,這時(shí)在窗口函數(shù)中執(zhí)行SetFoucs();焦點(diǎn)會自動跑到那個(gè)控件上去,子窗口同樣收不到滾輪消息。

解決:在執(zhí)行SetFoucs();語句前先Disable子窗體上的所有控件,然后執(zhí)行SetFoucs();,再Enanle所有控件,這時(shí)焦點(diǎn)才會在子窗口上。

本文轉(zhuǎn)自:http://blog.csdn.net/vanship/article/details/4119246

posted @ 2014-05-08 16:33 王海光 閱讀(4768) | 評論 (0)編輯 收藏
     一般地,當(dāng)在目標(biāo)機(jī)器編譯安裝某個(gè)服務(wù)程序后,為了使服務(wù)能開機(jī)自啟動和關(guān)機(jī)自停止,則需要將其添加為系統(tǒng)服務(wù)。但不同的Linux系統(tǒng)管理服務(wù)的方法不同,如Ubuntu使用update-rc.d命令,而RedHat則使用              chkconfig命令。因此為了能自動識別系統(tǒng)的類型,減少人工控制,編寫了一個(gè)簡單的autosrv腳本,要求至少1個(gè)最多2個(gè)參數(shù),特點(diǎn)如下:
     ● 第1個(gè)參數(shù)只能為install或uninstall,表示安裝或卸載服務(wù)。
     ● 第2參數(shù)是可選的,表示系統(tǒng)名稱,如果沒有指定,那么會自動識別,若出現(xiàn)提示錯(cuò)誤,則表示應(yīng)該要顯式指定系統(tǒng)名稱了。  
  1#! /bin/bash
  2# autosrv
  3
  4if [ $# -lt 1 ]; then
  5    echo "Usage: $(basename "$0") install | uninstall [sysname]"
  6    exit
  7elif [ "$1" != "install" -a "$1" != "uninstall" ]; then
  8    echo "The first parameter must be install or uninstall" 
  9    exit
 10fi
 11
 12action=$1
 13sysname=$2
 14srv_path=/etc/init.d/srv_name
 15
 16if [ -z "$sysname" ]; then
 17    sysname=`lsb_release -a | sed -n '2p' | awk '{if($0~/[Uu][Bb][Uu][Nn][Tt][Uu]/) print "ubuntu"; else if($0~/[Dd][Ee][Bb][Ii][Aa][Nn]/) print "debian"; else if($0~/[Rr][Ee][Dd][Hh][Aa][Tt]/) print "redhat"; else if($0~/[Cc][Ee][Nn][Tt][Oo][Ss]/) print "centos"; else print ""}'`
 18    if [ -z "$sysname" ]; then
 19        echo "Unknown system, please manual special it with the second parameter"
 20        exit
 21    fi
 22    echo "Current system is $sysname"
 23fi
 24
 25create_file_ubuntu_debian()
 26{
 27cat << END > $srv_path
 28#! /bin/bash
 29. /lib/lsb/init-functions
 30
 31END
 32cat srv_name.body >> $srv_path
 33}
 34
 35create_file_redhat_centos()
 36{
 37cat << END > $srv_path
 38#! /bin/bash
 39#chkconfig:2345 90 10
 40#description: srv name
 41
 42. /etc/rc.d/init.d/functions
 43
 44END
 45cat srv_name.body >> $srv_path
 46}
 47
 48chmod_file()
 49{
 50    chmod u+x $srv_path
 51}
 52
 53remove_file()
 54{
 55    rm -f $srv_path
 56}
 57
 58install_ubuntu_debian()
 59{
 60    create_file_ubuntu_debian
 61    chmod_file
 62    update-rc.d srv_name defaults 90 10
 63}
 64
 65uninstall_ubuntu_debian()
 66{
 67    update-rc.d -f srv_name remove
 68    remove_file
 69}
 70
 71install_redhat_centos()
 72{
 73    create_file_redhat_centos
 74    chmod_file
 75    chkconfig --add srv_name
 76}
 77
 78uninstall_redhat_centos()
 79{
 80    chkconfig --del srv_name
 81    remove_file
 82}
 83
 84case "$sysname" in
 85    ubuntu|debian)
 86    if [ "$action" = "install" ]; then
 87        install_ubuntu_debian
 88    else
 89        uninstall_ubuntu_debian
 90    fi
 91    ;;
 92
 93    redhat|centos)
 94    if [ "$action" = "install" ]; then
 95        install_redhat_centos
 96    else
 97        uninstall_redhat_centos
 98    fi
 99    ;;
100
101    *)
102    echo "Currently only support ubuntu, debian, redhat and centos system"
103    exit
104    ;;
105esac
      從上可知,自動識別的方法是獲取lsb_release -a返回的文本再使用awk來匹配ubuntu,redhat,debian,centos這幾個(gè)子串(忽略大小寫)。要注意的是,返回的文本可能有所不同,當(dāng)系統(tǒng)安裝了LSB模塊時(shí),返回結(jié)果如下
      沒有安裝時(shí),返回結(jié)果如下
      無論哪種情況,要提取分析的都是第2行文本,因此使用了sed -n '2p'。srv_name.body是不同系統(tǒng)相同的用于生成最終服務(wù)腳本的部分代碼文件,通常包含了start,stop,status,restart幾個(gè)函數(shù),只是沒有包含前面的一部分,而這部分則由autosrv腳本來根據(jù)不同的系統(tǒng)生成不同的代碼。

本文轉(zhuǎn)自:http://www.shnenglu.com/qinqing1984/archive/2014/01/03/205140.html
posted @ 2014-04-23 17:06 王海光 閱讀(456) | 評論 (0)編輯 收藏
C++使用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通信
文件映射是一種實(shí)現(xiàn)進(jìn)程間單向或雙向通信的機(jī)制。它允許兩個(gè)或多個(gè)本地進(jìn)程間相互通信。為了共享文件或內(nèi)存,所有的進(jìn)程必須使用相同的文件映射的名字或是句柄。
為了實(shí)現(xiàn)共享文件,第一個(gè)進(jìn)程先調(diào)用CreateFile方法。接下來調(diào)用CreateFileMapping方法來創(chuàng)建一個(gè)文件映射對象。并為文件映射指明一個(gè)句柄和名稱。由于事件,信號,互斥對象和文件映射等這些內(nèi)核對象都共享同一個(gè)名字空間,所以如果這個(gè)名字和其他一個(gè)對象的名稱重名的話那么將創(chuàng)建失敗。
為了實(shí)現(xiàn)共享內(nèi)存,進(jìn)程應(yīng)首先調(diào)用CreateFileMapping函數(shù)然后在hFile參數(shù)中傳入INVALID_HANDLE_VALUE宏來替代句柄。相應(yīng)的文件映射對象會從系統(tǒng)的分頁文件中獲得一段內(nèi)存。如果hFile參數(shù)的值是INVALID_HANDLE_VALUE,那么你在調(diào)用CreateFileMapping時(shí)必須給共享內(nèi)存指定一個(gè)大小值。
使用共享內(nèi)存或文件的進(jìn)程必須使用MapViewOfFile函數(shù)或MapViewOfFileEx函數(shù)來創(chuàng)建一個(gè)文件視圖。
示例代碼:
服務(wù)端:
HANDLE hfilemapping = NULL;
void CCSharedMemoryDlg::OnButton1()
{
    // TODO: Add your control notification handler code here
    hfilemapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 16, "COMBANC_SHARE");
    //創(chuàng)建錯(cuò)誤
    if ((hfilemapping == NULL) || (hfilemapping == INVALID_HANDLE_VALUE))
    //    return lx_invalid_sharedmemory;
        MessageBox("error");
    
    //共享內(nèi)存已經(jīng)存在
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        MessageBox("共享內(nèi)存已經(jīng)存在");
        return;
    }
    BYTE *psize = (BYTE *)MapViewOfFile(hfilemapping, FILE_MAP_WRITE, 0, 0, sizeof(BYTE));
    if(psize == NULL)
    {
        if (hfilemapping != NULL)
        {
            CloseHandle(hfilemapping);
            hfilemapping = NULL;
        }
        return;
    }

    CString sTest = "abc";
    char ch[16] = "COMBANC_TEST";
    memcpy(psize,sTest,sTest.GetLength());
    
    if (psize != NULL)
    {
        UnmapViewOfFile(psize );
        psize = NULL;
    }
}

客戶端:
HANDLE hfilemapping = NULL;
void CTestShareMemoryDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
     hfilemapping = OpenFileMapping(FILE_MAP_READ, FALSE, "COMBANC_SHARE");
     if ((hfilemapping == NULL) || (hfilemapping == INVALID_HANDLE_VALUE))
         MessageBox("error");
 
    BYTE *psize = (BYTE *)MapViewOfFile(hfilemapping, FILE_MAP_READ, 0, 0, sizeof(BYTE));
    if(psize == NULL)
    {
        if (hfilemapping != NULL)
        {
            CloseHandle(hfilemapping);
            hfilemapping = NULL;
        }
        return;    
    }

    char ch[16];
    memcpy(ch,psize,16);
    MessageBox(ch);

    if (psize  != NULL)
    {
        UnmapViewOfFile(psize );
        psize = NULL;
    }
    if (hfilemapping != NULL)
    {
        CloseHandle(hfilemapping);
        hfilemapping = NULL;
    }
}
posted @ 2014-04-11 18:37 王海光 閱讀(629) | 評論 (0)編輯 收藏

google 的開源項(xiàng)目 值 得我們一用的,這些項(xiàng)目很有意義,甚至可以直接用在我們自己的工作上!學(xué)習(xí)編程的的一個(gè)比較好的方式就是閱讀優(yōu)秀項(xiàng)目的源代碼,從而能夠了解作者的方法、 思路、技巧,另外閱讀源代碼對于一些朋友是枯燥乏味的,這是就可以看看項(xiàng)目的readme,找到項(xiàng)目的閃光點(diǎn),我們不做開拓者那我們就做實(shí)踐者和使用者, 呵呵,下面是這些項(xiàng)目的列表,在這里存檔,已備今后查閱之用

 

文本文件處理:

Google CRUSH (Custom Reporting Utilities for SHell)   

CRUSH是為命令行或shell scripts處理特定文字?jǐn)?shù)據(jù)而制作的一系列工具,這里有指南

C++庫和源代碼:

Google Breakpad  

一個(gè)開源的多平臺崩潰報(bào)告系統(tǒng)。   

Google GFlags  

Gflags是一個(gè)命令行標(biāo)記的處理庫,它可以替代“getopt()”,其內(nèi)置對C++的支持比如string。指南在此 。   

Google Glog  Glog庫可執(zhí)行應(yīng)用級的登陸,提供基于C++式的登陸API,可用于Linux、BSD和Windows。指南見此 。 

Google PerfTools    

這個(gè)工具可讓開發(fā)創(chuàng)建更強(qiáng)大的應(yīng)用程序,特別是那些用C++模版開發(fā)的多線程應(yīng)用程序,包括TCMalloc, heap-checker, heap-profiler 和cpu-profiler。指南見此 還有這里 。 

Google Sparse Hash    

非常節(jié)省內(nèi)存的hash-map。指南見此 。 

Omaha – Google Update    

Omaha,也就是Google Update,它可以保證你的軟件隨時(shí)升級到最新版本,目前很多Windows下的Google軟件都是用Omaha升級的,包括Google Chrome和Google Earth,當(dāng)然你也可以用于自己的應(yīng)用程序。指南看這里 還有這里 。 

Protocol Buffers    

Protocol Buffers是一種可擴(kuò)展編碼序列數(shù)據(jù)的方式,Google在幾乎所有內(nèi)部RPC協(xié)議和文件格式都使用了Protocol Buffers。指南見此 。它可以用于很多語言而且被一些IDE所支持,比如NetBeans 。 

互聯(lián)網(wǎng):

Google Code Pretiffy  這 是一個(gè)Javascript模塊和CSS文件,它可以讓HTML頁面里的部分源碼高亮顯示,支持C/C++, Java, Python, Ruby, PHP, VisualBasic, AWK, Bash, SQL, HTML, XML, CSS, JavaScript, Makefiles和部分Perl,不支持Smalltalk和所有的CAML。例子見此 。 

SpriteMe – easy “CSS spirtes”  SpriteMe使你可以更輕松的創(chuàng)造CSS Sprites(俗稱雪碧……)就是把網(wǎng)站要用到的圖片都堆在一張圖片里,用CSS控制調(diào)用哪個(gè)區(qū)域。它有一個(gè)自己的官網(wǎng)在這里 。 

Redacisaurus    

Reducisaurus是一個(gè)壓縮CSS和JS文件的網(wǎng)絡(luò)服務(wù),基于YUI壓縮算法,運(yùn)行于App Engine。 

JaikuEngine    

JaikuEngine是一個(gè)運(yùn)行于App Engine的微博系統(tǒng),由jaiku.com 運(yùn)營。要查看移動客戶端的源碼可以看這里 ,這里還有介紹 。 

Selector Shell    

Selector Shell是一個(gè)基于瀏覽器的測試工具,它可以讓你看到CSS在不同瀏覽器里的樣式,用Javascript寫的,你可以在這里測試 。 

Google Feed Server    

Google Feed Server是一個(gè)開源Atom發(fā)布協(xié)議服務(wù),基于Apache Abdera框架,允許開發(fā)者快速為當(dāng)前數(shù)據(jù)源(比如數(shù)據(jù)庫)配置feed。指南見這里 和這里 。 

Melange, the Spice of Creation    

這 個(gè)項(xiàng)目的目標(biāo)是創(chuàng)建出一個(gè)適合開源貢獻(xiàn)流程的框架,比如Google Summer of Code TM (GSoC)項(xiàng)目。使用這個(gè)框架你就可以用Google App Engine來運(yùn)行Google Summer of Code項(xiàng)目,和其它類似項(xiàng)目比如Google Highly Open Participation TM Contest和GHOP。指南見此 。 

NameBench    

它可以查找最快的DNS服務(wù)器給你的電腦用,在Mac OS X、Windows和UNIX系統(tǒng)下都有命令行也有用戶界面可以幫你測試,這是Google工程師用20%自由時(shí)間寫出來的。 

Rat Proxy    

一個(gè)半自動化的大型被動網(wǎng)絡(luò)應(yīng)用安全審查工具,專為精確的探測而優(yōu)化,文檔在此 。 

TopDraw    

Top Draw是一個(gè)圖形生成程序,使用簡單的文字腳本,基于JavaScript編程語言,Top Draw可以創(chuàng)造出非常復(fù)雜和有趣的圖形。支持Mac OS 10.5以上系統(tǒng),使用XCode開發(fā)。 

etherpad    

開源的EtherPad,這是一個(gè)基于網(wǎng)絡(luò)的實(shí)時(shí)合作文檔編輯器,這個(gè)項(xiàng)目主要是為了演示代碼而開發(fā),幫助那些想在自己服務(wù)器部署Etherpad的人使用,這里有如何安裝的指南。EtherPad使用JavaScript、Java和Comet服務(wù)器來建造實(shí)時(shí)協(xié)作服務(wù)。 

Chromium    

Chromium是開源版的Chrome瀏覽器,Chromium的目標(biāo)是建立一個(gè)新一代的強(qiáng)大網(wǎng)絡(luò)應(yīng)用程序,它與Chrome有很多不同之處。這里有指導(dǎo)如何在Linux上編譯Chromium 。 

V8 Google’s open source JavaScript engine  V8 是Google的開源JavaScript引擎,用C++寫成,用于Chrome瀏覽器之上。V8使用ECMAScript的ECMA-262第三版可運(yùn) 行于Windows XP、Vista、Mac OS 10.5和使用IA-32或ARM處理器的Linux。V8可獨(dú)立運(yùn)行也可嵌入到任何C++程序里使用,這里有指南 。 

Chromium OS    

Chromium OS是開源版的Chrome OS操作系統(tǒng),提供快速、簡單而安全的網(wǎng)絡(luò)體驗(yàn),源碼在此 。 

Android    

Android是第一個(gè)免費(fèi)、開源而且可完全自定義的移動平臺,提供完整的堆棧:一個(gè)操作系統(tǒng)、中間件和重要的一用應(yīng)用,它包含豐富的API可以讓第三方開發(fā)者開發(fā)出強(qiáng)大的應(yīng)用程序。 

MySQL工具:

Google MySQL Tools   

 

各種管理、維護(hù)和改進(jìn)MySQL數(shù)據(jù)庫性能的工具,由Google編寫,包括: 

  • mypgrep.py:一個(gè)類似pgrep的工具來管理MySQL連接
  • compact_innodb.py:可導(dǎo)出和重載所有表格的密集型innodb數(shù)據(jù)文件

Google mMAIM  

mMAIM的目標(biāo)是對MySQL的監(jiān)控和分析更簡單,且可以和任何環(huán)境整合使用。它可顯示主/從同步狀態(tài),一些性能狀態(tài),可以返回大量“show”命令的狀態(tài)等等。   

其它:

Stressful Application Test (stressapptest)  

Stressful Application Test試圖讓來自處理器和I/O到內(nèi)存的數(shù)據(jù)盡量隨機(jī)化,以創(chuàng)造出模擬現(xiàn)實(shí)的環(huán)境來測試現(xiàn)在的硬件設(shè)備是否穩(wěn)定,Google就在使用它,現(xiàn)在是Apache 2.0許可,這里有介紹 、安裝向?qū)?/a> 和指南 。   

Pop and IMAP Troubleshooter  

它用于診斷并解決客戶端到郵件服務(wù)器的連接問題。   

OpenDuckBill  

Openduckbill是一個(gè)Linux下簡單的命令行備份工具,可用于監(jiān)視文件/目錄在有變化后是否標(biāo)記為備份,并傳輸這些變化到本地備份目錄、遠(yuǎn)程N(yùn)FS導(dǎo)出分卷或是用rsync命令導(dǎo)出到遠(yuǎn)程SSH服務(wù)器。見安裝向?qū)?/a> 。   

ZXing  

ZXing(發(fā)音類似Zebra crossing)是Java的開源多格式1D/2D條碼圖像處理庫,目的是使用內(nèi)置在手機(jī)上的攝像頭拍照并對條碼進(jìn)行解碼,而不必與服務(wù)器通訊,它被用于Android系統(tǒng)。這里有向?qū)?/a> 和支持的設(shè)備列表 。 Tesseract OCR Engine  

Tesseract OCR引擎是1995年UNLV Accuracy測試的前三名之一,在1995和2006年之間它的進(jìn)展不大,但依然是當(dāng)前精度最高的OCR引擎。這個(gè)源碼可讀取二進(jìn)制、灰階或彩色圖片 并輸出文字,內(nèi)置一個(gè)TIFF閱讀器可讀取非壓縮的TIFF文件,增加libtiff后也可讀取壓縮圖片。指南 和問答 。   

Neatx – Open Source NX server  

Neatx是一個(gè)開源NX服務(wù),類似NoMachine公司商業(yè)的NX服務(wù)。NX協(xié)議比VNX更強(qiáng)大,它們的區(qū)別主要在:   

  • NX是X11客戶端所以不會發(fā)送位圖
  • NX可兼容X、VNC和Windows版的Remote Desktop
  • NX可緩存數(shù)據(jù)
  • NX安裝簡單

另外一個(gè)可選的項(xiàng)目可以看看Google的FreeNx 。 

PSVM    

它是這個(gè)文件 的代碼,這是一個(gè)SVM的“支持所有核心”的版本,可多機(jī)并行運(yùn)行,實(shí)例見此 。 

GO   

Google開發(fā)的新編程語言,谷奧有報(bào)道 。 

The Google Collections Library for Java    

這是一系列與Java 5以及更高版本有關(guān)的庫,Google花錢給買過來了。 

Google styleguide   

每個(gè)主流的開源項(xiàng)目 都有它自己的向?qū)问剑热缫幌盗械难菔敬a。如果這些代碼都按照“Style”的形式來演示,會更友好。

本文轉(zhuǎn)自:
http://blog.csdn.net/hkx1n/article/details/6176573

posted @ 2014-03-28 09:43 王海光 閱讀(674) | 評論 (0)編輯 收藏
僅列出標(biāo)題
共27頁: 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久裸体视频| 99综合在线| 一区二区三区欧美日韩| 亚洲成人在线网| 国产亚洲观看| 国产综合亚洲精品一区二| 国模大胆一区二区三区| 黄色另类av| 最近中文字幕mv在线一区二区三区四区| 国内外成人免费视频| 伊人久久亚洲美女图片| 亚洲国产一区在线观看| 亚洲人成在线播放网站岛国| 亚洲最新在线视频| 欧美一二三视频| 欧美成人一区二区| 国产精品美女999| 激情久久五月天| 亚洲精品久久久久中文字幕欢迎你 | 99精品国产热久久91蜜凸| 日韩一二三区视频| 亚洲欧美国产日韩天堂区| 久久国内精品视频| 亚洲第一区中文99精品| 亚洲视频图片小说| 久久久久久91香蕉国产| 欧美日韩一区二区三区在线视频 | 国产精品黄色| 欧美日韩喷水| 国产精品一区免费在线观看| 精品不卡一区| a4yy欧美一区二区三区| 欧美亚洲综合在线| 欧美激情在线免费观看| 亚洲一区视频| 欧美精品激情在线观看| 国产综合在线视频| 国产精品99久久久久久久久久久久| 欧美自拍偷拍午夜视频| 亚洲国产天堂久久综合网| 欧美一区二区三区四区在线| 欧美日韩精品一本二本三本| 精品电影在线观看| 久久成人亚洲| 中文日韩电影网站| 欧美成人国产va精品日本一级| 国产欧美日韩不卡免费| 这里只有精品视频| 亚洲电影在线观看| 久久精品导航| 国产一区二区三区不卡在线观看 | 久久精品国产精品亚洲精品| 欧美特黄一级大片| 99这里只有久久精品视频| 美国三级日本三级久久99| 亚洲自拍都市欧美小说| 国产精品国产| 亚洲综合日韩中文字幕v在线| 亚洲国产精品女人久久久| 久久男女视频| 国产在线视频不卡二| 欧美一区二区日韩| 一区二区三区国产精华| 国产精品wwwwww| 亚洲主播在线播放| 亚洲午夜视频在线观看| 国产精品黄视频| 性欧美暴力猛交69hd| 亚洲一区影音先锋| 国产九九精品视频| 久久xxxx| 久久久久久69| 亚洲大片av| 亚洲精品乱码久久久久久| 欧美日韩国产综合新一区| 亚洲一级在线| 亚洲欧美日韩综合| 一区二区亚洲欧洲国产日韩| 欧美黄色影院| 欧美午夜美女看片| 久久精品欧洲| 亚洲精品视频在线观看网站| 国产亚洲精品久| 欧美一区二区视频在线观看2020| 亚洲欧美日韩国产综合在线| 国内精品**久久毛片app| 蜜桃久久av一区| 欧美女同视频| 久久高清福利视频| 免费在线观看精品| 亚洲天堂第二页| 欧美一区二区精品| 亚洲国产精品热久久| 日韩视频在线观看| 黄色av成人| 亚洲精品小视频在线观看| 国产精品hd| 免费看的黄色欧美网站| 欧美日韩在线播放一区| 久久av免费一区| 欧美区二区三区| 久久久青草婷婷精品综合日韩| 欧美激情五月| 久久婷婷丁香| 国产精品福利在线| 欧美激情一区二区三级高清视频 | 国产一区二区视频在线观看 | 好吊成人免视频| 亚洲美女在线看| 国产亚洲一级| 一区二区日韩精品| 亚洲区一区二| 午夜国产精品视频| 亚洲午夜久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲综合激情| 欧美日本亚洲| 欧美国产欧美综合 | 一区二区三区偷拍| 亚洲国产日韩一区二区| 新67194成人永久网站| 一区二区三区欧美在线| 久久亚洲一区| 亚洲影院在线观看| 欧美日韩www| 欧美黄色视屏| 亚洲国产一区二区三区高清| 久久久青草青青国产亚洲免观| 欧美在线国产| 国产精品三级视频| 亚洲一级高清| 亚洲欧美日韩一区二区在线| 欧美激情一区二区三区四区| 麻豆精品在线播放| 国产综合色精品一区二区三区| 亚洲欧美一区二区精品久久久| 亚洲免费中文字幕| 国产精品福利影院| 亚洲一级特黄| 亚洲欧美春色| 国产美女精品| 蜜乳av另类精品一区二区| 午夜亚洲影视| 久久久久青草大香线综合精品| 国产视频一区在线观看| 午夜精品久久久久久久蜜桃app| 亚洲一区免费在线观看| 欧美涩涩视频| 亚洲午夜精品国产| 欧美有码在线视频| 韩日成人在线| 欧美国产日韩一二三区| 亚洲国产你懂的| 夜夜精品视频| 国产精品久久久久久久久久免费看| 亚洲视频福利| 亚洲欧美日韩国产成人| 国产亚洲精品aa| 久久这里有精品15一区二区三区| 免费在线观看日韩欧美| 亚洲三级视频在线观看| 欧美视频不卡| 久久久国产精彩视频美女艺术照福利 | 国产精品xxxxx| 亚洲欧美日本国产专区一区| 久久久噜噜噜久久人人看| 亚洲激情校园春色| 国产精品热久久久久夜色精品三区| 欧美亚洲免费电影| 免费观看欧美在线视频的网站| 亚洲国产精品成人一区二区 | 欧美jjzz| 一区二区三区国产精华| 国产日韩亚洲欧美综合| 欧美成人久久| 午夜精品久久久久久99热软件| 久久综合福利| 亚洲一区二区久久| 亚洲电影欧美电影有声小说| 欧美色中文字幕| 久久久水蜜桃| 亚洲网址在线| 亚洲国产人成综合网站| 欧美在线欧美在线| 日韩一级精品| 亚洲高清资源综合久久精品| 国产精品美女久久久浪潮软件| 另类成人小视频在线| 亚洲欧美中文另类| 日韩一级精品视频在线观看| 米奇777在线欧美播放| 性欧美长视频| 99在线观看免费视频精品观看| 精品成人一区二区三区| 国产精品色一区二区三区| 欧美精品不卡| 麻豆视频一区二区| 久久成人精品无人区| 亚洲在线电影| 亚洲一区在线看|