精华内容
下载资源
问答
  • MFC 对话框背景图片

    2020-09-09 20:37:25
    为了实现美化对话框背景的效果,我们需要让我们的对话框响应WM_CTLCOLOR消息,每当我们的对话框或者它的子控件需要重绘时,我们的对话框都会收到这个消息, 因此,我们需要为对话框添加WM_CTLCOLOR的

    在windows开发当中做界面的主要技术之一就是使用MFC,通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现。今天我们来说一下如何用MFC美化对话框,默认情况下,对话框的背景如下:

    那么,我们如何将它的背景变成如下界面呢,而且还要保留对话框的移动功能,漂亮背景如下:

    为了实现美化对话框背景的效果,我们需要让我们的对话框响应WM_CTLCOLOR消息,每当我们的对话框或者它的子控件需要重绘时,我们的对话框都会收到这个消息,

    因此,我们需要为对话框添加WM_CTLCOLOR的消息响应函数,完成对消息的处理,WM_CTLCOLOR的响应函数定义如下:

     

    
     
    1. HBRUSH CMFCDialogUIDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

    2. {

    3. HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    4.  
    5. if (pWnd == this)

    6. {

    7. return m_bkBrush;

    8. }

    9.  
    10. return hbr;

    11. }

    当我们的对话框需要重绘的时候,我们的对话框就会收到WM_CTLCOLOR消息,然后我们的对话框处理函数会调用OnCtlColor函数来处理该消息,在这个函数中,pDC代表我们要绘制的上下文环境,pWnd代表我们要绘制的窗口指针,nCtlColor代表我们要绘制的窗口类型,在函数的内部我们首先调用父类的OnCtlColor,目的是为了对该消息做默认处理,这是MFC消息响应函数的惯用写法,但是在我们这里,我们不能使用默认处理返回的画刷,所以我们需要做一个特殊的判断,如果pWnd指向的窗口地址是当前对话框,那么我们就返回m_bkBrush,这个画刷是一个图像画刷,它会在我们的对话框客户区绘制我们想让它显示的图片。下面我们看一下m_bkBrush是如何创建的,首先在我们的对话框的头文件中增加一个CBrush变量,变量名是m_bkBrush,然后在对话框的OnInitDialog中初始化它,OnInitDialog的定义如下:

     

     

    
     
    1. BOOL CMFCDialogUIDlg::OnInitDialog()

    2. {

    3. CDialogEx::OnInitDialog();

    4.  
    5. // 将“关于...”菜单项添加到系统菜单中。

    6.  
    7. // IDM_ABOUTBOX 必须在系统命令范围内。

    8. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

    9. ASSERT(IDM_ABOUTBOX < 0xF000);

    10.  
    11. CMenu* pSysMenu = GetSystemMenu(FALSE);

    12. if (pSysMenu != NULL)

    13. {

    14. BOOL bNameValid;

    15. CString strAboutMenu;

    16. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

    17. ASSERT(bNameValid);

    18. if (!strAboutMenu.IsEmpty())

    19. {

    20. pSysMenu->AppendMenu(MF_SEPARATOR);

    21. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

    22. }

    23. }

    24.  
    25. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动

    26. // 执行此操作

    27. SetIcon(m_hIcon, TRUE); // 设置大图标

    28. SetIcon(m_hIcon, FALSE); // 设置小图标

    29.  
    30. // TODO: 在此添加额外的初始化代码

    31.  
    32. CString strBmpPath = _T(".\\res\\Background.png");

    33.  
    34. CImage img;

    35.  
    36. img.Load(strBmpPath);

    37.  
    38. MoveWindow(0, 0, img.GetWidth(), img.GetHeight());

    39.  
    40. CBitmap bmpTmp;

    41.  
    42. bmpTmp.Attach(img.Detach());

    43.  
    44. m_bkBrush.CreatePatternBrush(&bmpTmp);

    45.  
    46. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE

    47. }

    现在我们看一下,在OnInitDialog中,我们都做了什么,首先,我们创建了一个CString变量strBmpPath,用它指向我们的图片文件,然后我们创建了一个CImage变量img,这个变量可以方便的加载各种格式的图像文件,所以我们使用它的目的是为了方便加载png格式的文件,MoveWindow的目的是为了调整我们的对话框客户区的大小,使客户区的大小与图片的大小一致,然后我们创建了一个CBitmap类型变量bmpTmp,使用它是因为CBrush的成员函数CreatePatternBrush的参数要求输入这种类型的参数,所以必须将img转换成CBitmap,转换的方法是bmpTmp.Attach(img.Detach()),img.Detach会释放图像的句柄,并且返回这个句柄,bmpTmp使用Attach绑定img返回的图像句柄,从而完成了对象类型的转换,最后调用CreatePatternBrush,这个函数的功能是使用传递给它的图像创建一个图像画刷,然后在OnCtlColor中,使用它填充对话框的背景,程序运行效果如下:

    现在虽然程序的客户区已经变成了对话框的背景,但是对话框原来的标题栏和背景图片的标题栏重复,看起来很别扭,通过设置对话框的Border属性可以消除原来的标题栏,设置如下:

    Border:None

    再次编译,运行程序,效果如下:

    现在的对话框背景已经和我们设想的基本一致,还有一点小瑕疵,大家仔细观察对话框的底边,左下角和右下角有多于的像素,下面我们通过代码消除它。

    在OnInitDialog尾部追加如下代码:

     

    
     
    1. CRgn rgnTmp;

    2. RECT rc;

    3. GetClientRect(&rc);

    4. rgnTmp.CreateRoundRectRgn(rc.left + 3, rc.top + 3, rc.right - rc.left - 3, rc.bottom-rc.top -3, 6, 6);

    5. SetWindowRgn(rgnTmp, TRUE);

    通过以上的代码可以让对话框变成一个圆角矩形,这样就可以去掉边角的点,程序最终运行效果如下:

    现在这个对话框的背景已经完全符合我们的要求,但是它现在不能拖动,因为它的标题栏是假的,所以,我们最后一个目标就是让这个窗口可以拖动,如何才能让它移动呢?

    Windows只允许我们拖动对话框的标题栏,当我们的鼠标在对话框上拖动的时候,对话框会收到一个WM_NCHITTEST消息,默认的消息处理函数会判断当前的鼠标是否在对话框的标题栏,如果在就返回HTCAPTION标志,否则就返回其它标志,当返回HTCAPTION标志的情况下,系统就会允许对话框拖动,所以我们可以欺骗windows系统,让WM_NCHITTEST的响应函数永远返回HTCAPTION标志就可以了,为对话框添加WM_NCHITTEST响应函数,代码如下:

     

    
     
    1. LRESULT CMFCDialogUIDlg::OnNcHitTest(CPoint point)

    2. {

    3. // TODO: 在此添加消息处理程序代码和/或调用默认值

    4. LRESULT ret = CDialogEx::OnNcHitTest(point);

    5. return (ret == HTCLIENT) ? HTCAPTION : ret;

    6. }

    重新编译代码,现在的对话框背景已经美化完成,并且这个对话框可以拖动。

    展开全文
  • QQ对话框背景渐变色

    千次阅读 2015-08-31 11:27:33
    在drawable中新建文件,type的类型还有圆形,扇形 shape xmlns:android=...gradient android:type="linear" android:startColor="#aee3d9" android:centerColor="#d5decd

    在drawable中新建文件,type的类型还有圆形,扇形

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <gradient 
        android:type="linear"
        android:startColor="#aee3d9"
        android:centerColor="#d5decd"
        android:endColor="#fff4de"
        android:angle="-90"/>   
    </shape>

    聊天程序设计

    主布局(list_message.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:id="@+id/grid_in_below"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#18b4ed"
            android:gravity="center"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="杜 Q"
                android:textSize="20sp" />
        </LinearLayout>
    
        <ListView
            android:id="@+id/msg_list_view"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@drawable/dialog_background"
            android:cacheColorHint="#ffffffff"
            android:divider="#55ff0000" >
        </ListView>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ebecee"
            android:gravity="center" >
    
            <ImageView
                android:id="@+id/image_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.20"
                android:src="@drawable/eoj" />
    
            <Button
                android:id="@+id/image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_marginBottom="5dp"
                android:layout_marginLeft="5dp"
                android:layout_marginTop="5dp" />
    
            <Button
                android:id="@+id/left_send"
                android:layout_width="wrap_content"
                android:layout_height="30dp"
                android:layout_gravity="bottom"
                android:layout_margin="5dp"
                android:background="@drawable/obtain_verification"
                android:padding="5dp"
                android:text="left" />
    
            <EditText
                android:id="@+id/input_text"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:background="@drawable/edit_shape"
                android:ems="10"
                android:hint="请输入要发送的内容"
                android:inputType="textMultiLine"
                android:maxHeight="200dp"
                android:maxLines="8"
                android:minHeight="30dp"
                android:paddingBottom="5dp"
                android:paddingTop="5dp" >
            </EditText>
    
            <Button
                android:id="@+id/right_send"
                android:layout_width="wrap_content"
                android:layout_height="30dp"
                android:layout_gravity="bottom"
                android:layout_margin="5dp"
                android:background="@drawable/obtain_verification"
                android:padding="5dp"
                android:text="right" />
        </LinearLayout>
    
        <GridView
            android:id="@+id/image_gridView"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="#ffffff"
            android:numColumns="5"
            android:visibility="gone" >
        </GridView>
    
    </LinearLayout>

    单条左边Msg的布局(send_receive.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="10dp"
            android:text=""
            android:textColor="#000000" />
    
        <LinearLayout
            android:id="@+id/left_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left" >
    
            <ImageView
                android:id="@+id/left_image_view_head"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:src="@drawable/ic_launcher" />
    
            <LinearLayout
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical" >
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >
    
                    <TextView
                        android:id="@+id/left_office_title_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/yingzhang_shape_background"
                        android:text="营长"
                        android:textColor="@color/white"
                        android:textSize="15sp" />
    
                    <TextView
                        android:id="@+id/left_nicheng"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="昵称"
                        android:textColor="#000000" />
                </LinearLayout>
    
                <TextView
                    android:id="@+id/left_msg"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="70dp"
                    android:background="@drawable/eng"
                    android:gravity="center"
                    android:text="dddddddddddddddddddddddddddddddddddddddd"
                    android:textColor="#000000"
                    android:textSize="20sp" />
            </LinearLayout>
        </LinearLayout>
    
    </LinearLayout>

    单条右边Msg的布局(send_right.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="right"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/right_time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="10dp"
            android:text=""
            android:textColor="#000000" />
    
        <LinearLayout
            android:id="@+id/right_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
    
            <LinearLayout
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="right"
                android:orientation="vertical" >
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:gravity="right" >
    
                    <TextView
                        android:id="@+id/right_nicheng"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="454"
                        android:textColor="#000000" />
    
                    <TextView
                        android:id="@+id/right_office_title_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/yingzhang_shape_background"
                        android:text="营长" />
                </LinearLayout>
    
                <TextView
                    android:id="@+id/right_msg"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="70dp"
                    android:background="@drawable/eog"
                    android:gravity="center"
                    android:text="kl"
                    android:textColor="#000000"
                    android:textSize="20sp" />
            </LinearLayout>
    
            <ImageView
                android:id="@+id/right_image_view_head"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:src="@drawable/ic_launcher" />
        </LinearLayout>
    
    </LinearLayout>

    Msg的适配器类

    package com.normal.mymsg;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    
    import com.test.login.R;
    import com.test.message_send_receive.Msg;
    
    import android.graphics.drawable.Drawable;
    import android.text.Html;
    import android.text.Html.ImageGetter;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.SimpleAdapter;
    import android.widget.TextView;
    
    public class MyAdapter extends BaseAdapter {
        //给短信设置不同的类型,根据不同的类型选择不同的适配器
        public static final int TYPE_RECEIVED = 0;
        public static final int TYPE_SEND = 1;
        //因为有两种类型,所以type的最多有两种
        public static final int MAX_TYPE = 2;
        //得到LayoutInflater 
        private LayoutInflater mInflater;
        //把主文件集合中的数据传递过来
        private List<MyMsg> mData;
        //Spanned的一个参数
        private Html.ImageGetter mImageGetter;
        //时间转换形式
        private SimpleDateFormat mFormat = new SimpleDateFormat("EE HH:mm");
        public MyAdapter(LayoutInflater mInflater, List<MyMsg> mData, Html.ImageGetter mImageGetter) {
            this.mInflater = mInflater;
            this.mData = mData;
            this.mImageGetter = mImageGetter;
        }
    
        @Override
        public int getItemViewType(int position) {
            // 得到布局的类型
            return mData.get(position).getType();
        }
    
        // 查看缓存类型的数量
        @Override
        public int getViewTypeCount() {
    
            return MAX_TYPE;
        }
    
        @Override
        public int getCount() {
            //都是根据传入的集合进行设置
            return mData.size();
        }
    
        //
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            int type = getItemViewType(position);
            ViewHolderRight vRight = null;
            ViewHolder viewHolder = null;
            if (convertView == null) {
                //通过类型选择要填充的视图布局
                switch (type) {
                case TYPE_RECEIVED:
    
                    convertView = mInflater.inflate(R.layout.send_receive, null);
                    viewHolder = new ViewHolder();
                    viewHolder.leftLayout = (LinearLayout) convertView.findViewById(R.id.left_layout);
                    viewHolder.imageView_header = (ImageView) convertView.findViewById(R.id.left_image_view_head);
                    viewHolder.textview_time = (TextView) convertView.findViewById(R.id.time);
                    viewHolder.textview_message = (TextView) convertView.findViewById(R.id.left_msg);
                    viewHolder.textview_nicheng = (TextView) convertView.findViewById(R.id.left_nicheng);
                    viewHolder.textview_ofice_title = (TextView) convertView.findViewById(R.id.left_office_title_text);
                    convertView.setTag(viewHolder);
    
                    break;
                case TYPE_SEND:
                    convertView = mInflater.inflate(R.layout.send_right, null);
                    vRight = new ViewHolderRight();
                    vRight.rightLayout = (LinearLayout) convertView.findViewById(R.id.right_layout);
                    vRight.imageView_header = (ImageView) convertView.findViewById(R.id.right_image_view_head);
                    vRight.textview_time = (TextView) convertView.findViewById(R.id.right_time);
                    vRight.textview_message = (TextView) convertView.findViewById(R.id.right_msg);
                    vRight.textview_nicheng = (TextView) convertView.findViewById(R.id.right_nicheng);
                    vRight.textview_ofice_title = (TextView) convertView.findViewById(R.id.right_office_title_text);
                    convertView.setTag(vRight);
                    break;
                default:
                    break;
                }
            }
            MyMsg msg = mData.get(position);
            //通过类型赋给不同布局的参数值
            switch (type) {
            case TYPE_RECEIVED:
                viewHolder = (ViewHolder) convertView.getTag();
                viewHolder.imageView_header.setImageResource(R.drawable.ic_launcher);
                String time = mFormat.format(new Date(msg.getTime()));
                viewHolder.textview_time.setText(time);
                viewHolder.textview_message.setText(Html.fromHtml(msg.getMessage(), mImageGetter, null));
                viewHolder.textview_nicheng.setText(msg.getNicheng());
                viewHolder.textview_ofice_title.setText(msg.getOffice_title());
                break;
    
            case TYPE_SEND:
                vRight = (ViewHolderRight) convertView.getTag();
                vRight.imageView_header.setImageResource(R.drawable.ic_launcher);
                String time2 = mFormat.format(new Date(msg.getTime()));
                vRight.textview_time.setText(time2);
                vRight.textview_message.setText(Html.fromHtml(msg.getMessage(), mImageGetter, null));
                vRight.textview_nicheng.setText(msg.getNicheng());
                vRight.textview_ofice_title.setText(msg.getOffice_title());
                break;
            default:
                break;
            }
    
            return convertView;
        }
    
        class ViewHolder {
            LinearLayout leftLayout;
            ImageView imageView_header;
            TextView textview_ofice_title;
            TextView textview_nicheng;
            TextView textview_time;
            TextView textview_message;
        }
    
        class ViewHolderRight {
            LinearLayout rightLayout;
            ImageView imageView_header;
            TextView textview_ofice_title;
            TextView textview_nicheng;
            TextView textview_time;
            TextView textview_message;
        }
    }
    

    MyMsg类

    package com.normal.mymsg;
    
    import android.text.Spanned;
    
    public class MyMsg {
        private int image;
        private String office_title;
        private String nicheng;
        private Long time;
        private String message;
        private int type;
        public static final int TYPE_RECEIVED=0;
        public static final int TYPE_SEND=1;
        public int getType() {
            return type;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
    
    
        public MyMsg(int image, String office_title, String nicheng, Long time, String message) {
    
            this.image = image;
            this.office_title = office_title;
            this.nicheng = nicheng;
            this.time = time;
            this.message = message;
        }
    
        public void setImage(int image) {
            this.image = image;
        }
    
        public void setOffice_title(String office_title) {
            this.office_title = office_title;
        }
    
        public void setNicheng(String nicheng) {
            this.nicheng = nicheng;
        }
    
        public void setTime(Long time) {
            this.time = time;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public MyMsg() {
    
        }
    
        public int getImage() {
            return image;
        }
    
        public String getOffice_title() {
            return office_title;
        }
    
        public String getNicheng() {
            return nicheng;
        }
    
        public Long getTime() {
            return time;
        }
    
        public String getMessage() {
            return message;
        }
    }
    

    主函数类

    package com.test.message_send_receive;
    
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.normal.image.ExpresionAdapter;
    import com.normal.mymsg.MyAdapter;
    import com.normal.mymsg.MyMsg;
    import com.test.login.R;
    import com.test.login.R.layout;
    import com.test.message_image.ConcreteWatched;
    import com.test.message_image.ImageAdapter;
    import com.test.message_image.ImageDialog;
    import com.test.message_image.MsgImage;
    import com.test.message_image.Watched;
    
    import android.app.Activity;
    import android.content.DialogInterface;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.support.v7.app.AlertDialog;
    import android.text.Html;
    import android.text.SpannableString;
    import android.text.SpannableStringBuilder;
    import android.text.Spanned;
    import android.text.SpannedString;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.GridView;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.PopupWindow;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainMessage extends Activity implements OnClickListener {
        private Html.ImageGetter mImageGeter;
        private ListView mListView;
        private EditText mEditText;
        private ImageView mImageView;
        private LayoutInflater mInflater;
        private Button mLeftSend;
        private Button mRightSend;
        private MyAdapter myAdapter;
        //把短信类放入到一个集合中
        private List<MyMsg> myListImage = new ArrayList<>();
        private Button mImage;
        private ExpresionAdapter mExpresionAdapter;
        private GridView mTeacheGridView;
        //为不同图片的名称,对应ImageAdapter中的文件顺序
        private String[] mImageData = { "dra", "drb", "drc", "drd", "dre", "drf", "drg", "drh", "dri", "drj", "drk", "drl",
                "drm", "drn", "dro", "drp", "drq", "drr", "drs", "drt", "dru", "drv", "drw", "drx", "dry", "drz" };
        //下面这几句主要是PopupWindow 用得到
        private PopupWindow mPopupWindow;
        private LinearLayout gridBelow;
        private GridView mPopGridView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.list_message);
            //初始化PopupWindow 
            mPopupWindow = new PopupWindow(this);
            //设置PopupWindow 的宽度
            mPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
            //设置PopupWindow 的高度
            mPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
            //把PopupWindow 设为焦点
            mPopupWindow.setFocusable(true);
            //同时设置PopupWindow 外面是可以点击的
            mPopupWindow.setOutsideTouchable(true);
            //得到PopupWindow 的视图布局
            View popupWindow = getLayoutInflater().inflate(R.layout.popupview, null);
            //设置为填充布局
            mPopupWindow.setContentView(popupWindow);
            //给PopupWindow 添加GridView布局
            mPopGridView = (GridView) popupWindow.findViewById(R.id.pop_gridView);
            //设置popupWindow显示在哪个控件下面
            gridBelow = (LinearLayout) findViewById(R.id.grid_in_below);
    
            //为最左边的图片
            mImageView = (ImageView) findViewById(R.id.image_view);
    
            mListView = (ListView) findViewById(R.id.msg_list_view);
            //图片旁边那个键
            mImage = (Button) findViewById(R.id.image);
    
            mImage.setOnClickListener(this);
            mLeftSend = (Button) findViewById(R.id.left_send);
            mLeftSend.setOnClickListener(this);
            mRightSend = (Button) findViewById(R.id.right_send);
            mRightSend.setOnClickListener(this);
            //得到图片单条的视图布局
            mTeacheGridView = (GridView) findViewById(R.id.image_gridView);
            "****重点****"
            mInflater = getLayoutInflater();
            mImageGeter = new Html.ImageGetter() {
                @Override
                public Drawable getDrawable(String source) {
                    Drawable drawable = null;
                    if (source != null) {
                        //利用反射,查找对应的图片
                        Class clazz = R.drawable.class;
    
                        try {
                            Field field = clazz.getDeclaredField(source);
                            //得到图片的id,为了设置图片的大小
                            int sourcedId = field.getInt(clazz);
                            drawable = getResources().getDrawable(sourcedId);
                            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                        } catch (NoSuchFieldException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IllegalArgumentException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
    
                    } else {
                        //也是为了设置在富文本中要显示图片的大小
                        drawable = getResources().getDrawable(R.drawable.ic_launcher);
                        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                    }
    
                    return drawable;
                }
            };
    
            mImageView.setOnClickListener(this);
            //得到图片的适配器,初始化,
            mExpresionAdapter = new ExpresionAdapter(getLayoutInflater());
            //给Expresion添加适配器
            mTeacheGridView.setAdapter(mExpresionAdapter);
            //给PopupWindow添加适配器
            mPopGridView.setAdapter(mExpresionAdapter);
            //为单条短信的适配器
            myAdapter = new MyAdapter(mInflater, myListImage, mImageGeter);
            //给短信的集合添加适配器
            mListView.setAdapter(myAdapter);
            //设置Expresion的点击事件,同时将对应的图片显示在EditText中
            mTeacheGridView.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Spanned span = Html.fromHtml("<img src='" + mImageData[position] + "'/>", mImageGeter, null);
                    mEditText.getText().insert(mEditText.getSelectionStart(), span);
    
                }
            });
            //设置PopupWindow的点击事件,同时将对应的图片显示在EditText中
    
            mPopGridView.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Spanned span = Html.fromHtml("<img src='" + mImageData[position] + "'/>", mImageGeter, null);
                    mEditText.getText().insert(mEditText.getSelectionStart(), span);
    
                }
            });
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
    
            case R.id.left_send:
                //将不同的短信类型填入,为了适配器中便于区分
                MyMsg msg = new MyMsg();
                //设置头像
                msg.setImage(R.drawable.ic_launcher);
                msg.setMessage(filterHtml(Html.toHtml(mEditText.getText())));
                //设置昵称
                msg.setNicheng("小康");
                //设置等级
                msg.setOffice_title("营长");
                msg.setTime(System.currentTimeMillis());
                msg.setType(MyAdapter.TYPE_RECEIVED);
    
                myListImage.add(msg);
                myAdapter.notifyDataSetChanged();
                mListView.setSelection(myListImage.size() - 1);
                mEditText.setText("");
                break;
    
            case R.id.right_send:
    
                MyMsg msg1 = new MyMsg();
                msg1.setImage(R.drawable.ic_launcher);
                msg1.setMessage(filterHtml(Html.toHtml(mEditText.getText())));
                msg1.setNicheng("小康");
                msg1.setOffice_title("营长");
                msg1.setTime(System.currentTimeMillis());
                msg1.setType(MyAdapter.TYPE_SEND);
    
                myListImage.add(msg1);
                myAdapter.notifyDataSetChanged();
                mListView.setSelection(myListImage.size() - 1);
                mEditText.setText("");
                break;
            case R.id.image:
                if (mPopGridView.getVisibility() == View.VISIBLE) {
                    mPopGridView.setVisibility(View.GONE);
                } else {
                    mPopGridView.setVisibility(View.VISIBLE);
                }
                mPopupWindow.showAsDropDown(gridBelow);
                break;
            case R.id.image_view:
                if (mTeacheGridView.getVisibility() == View.VISIBLE) {
                    mTeacheGridView.setVisibility(View.GONE);
                } else {
                    mTeacheGridView.setVisibility(View.VISIBLE);
                }
                break;
    
            }
        }
    
        //因为在EditText中已经为Spanned形式,所以用此方法转换成一般形式,最后在适配器中在转化成Spanned形式
        private String filterHtml(String str) {
            str = str.replaceAll("<(?!br|img)[^>]+>", "").trim();
            return str;
        }
    
    }
    

    Image的布局(teache_image.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <ImageView 
            android:id="@+id/teache_image"
    
            android:padding="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
    </LinearLayout>
    

    ExpresionAdapter 的适配器

    package com.normal.image;
    
    import com.test.login.R;
    
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    
    public class ExpresionAdapter extends BaseAdapter {
        private int[] mData = { R.drawable.dra, R.drawable.drb, R.drawable.drc, R.drawable.drd, R.drawable.dre,
                R.drawable.drf, R.drawable.drg, R.drawable.drh, R.drawable.dri, R.drawable.drj, R.drawable.drk,
                R.drawable.drl, R.drawable.drm, R.drawable.drn, R.drawable.dro, R.drawable.dro, R.drawable.drq,
                R.drawable.drr, R.drawable.drs, R.drawable.drt, R.drawable.dru, R.drawable.drv, R.drawable.drw,
                R.drawable.drx, R.drawable.dry, R.drawable.drz };
        private LayoutInflater mInflater;
    
        public ExpresionAdapter(LayoutInflater mInflater) {
            this.mInflater = mInflater;
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mData.length;
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder = null;
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.teache_image, null);
                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.teache_image);
                convertView.setTag(viewHolder);
            }
            viewHolder = (ViewHolder) convertView.getTag();
            viewHolder.imageView.setImageResource(mData[position]);
            return convertView;
    
        }
    
        class ViewHolder {
            ImageView imageView;
        }
    
    }
    

    PopupWindow的布局(popupwindow.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <GridView 
            android:id="@+id/pop_gridView"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:numColumns="5"></GridView>
    
    </LinearLayout>
    
    展开全文
  • 怎样给QQ的对话框设置颜色?请问各道高手,如何把QQ对话框白色部分变成透明,CSS布局HTML小编今天和大家分享...怎么设定QQ对话框的默认大小打开那个对话框的大小我觉得不爽,怎么能按照自己的意愿,更改默认的大小欢...

    怎样给QQ的对话框设置颜色?

    请问各道高手,如何把QQ对话框白色部分变成透明,CSS布局HTML小编今天和大家分享教程。。高分悬赏

    首先,当然是要登陆QQ,然后选择最上方的衣服图标,进入皮肤设置。

    efedc956a494057f720de59a1bc0f022.png

    然后可以选择其中的任何一个皮肤做背景,一选择,即刻更更改。除非标明VIP或者会员享有的不能选择,其它都可以的。

    怎么设定QQ对话框的默认大小

    打开那个对话框的大小我觉得不爽,怎么能按照自己的意愿,更改默认的大小

    欢迎来到CSS布局HTML楼主。~ 很高兴看到你的问题。 但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。 对于你的问题我爱莫能助。 可能是你问的问题有些专业了,或者别人没有遇到或者接触过你的问题。

    qq对话框中颜色的设置怎么改?

    就是发出消息以后显示的用户名和时间的颜色怎么改?可以改吗?

    电脑登录QQ,打开一个好友对话框,然后点击更多设置图标。

    点击更多设置后,点击字体选择

    进入气泡页面,可以根据情况选择气泡类型。

    点击气泡设置好之后,发送信息就可以看到对话框颜色变了。

    怎样设置qq对话框多个合并成一个

    QQ面板上有一个系统设置里面有 赞同

    首先打开qq,在QQ页面中往右滑动屏幕后点击“个性装扮”选项。

    然后在该页面中点击打开“更多”选项。

    之后在该页面中点击打开“背景”选项。

    然后在该页面中点击选择想设置的背景即可。

    首先打开个好友聊天窗口,在聊天窗口上找到“窗口设置”在关闭的旁边

    QQ对话框颜色的设置是登QQ,然后在主面板的右上角的“更改外观”:,然后就可以进入皮肤设置了,可以选择推荐的,也可以选择自定义设置,就是上传自己喜欢的皮肤。

    首先在手机QQ的菜单页面中点击【个性装扮】。

    进入到手机QQ的个性装扮的操作页面以后,接着点击【背景】。

    进入到背景的操作页面以后,然后选择你要切换的背景颜色主题。

    最后选择好要切换的背景主题颜色以后。

    展开全文
  • * QQ:349384061 * 用法 * 1.让对话框类公有继承本类 * 2.在对话框类的消息映射宏后面添加消映射链 CHAIN_MSG_MAP(CPaintColor) * 3.本类只是简单的演示,可在此基础上扩展 */ template <class T> //T 为...
    /*
    * 编写: GUO 
    * QQ:349384061
    * 用法
    * 1.让对话框类公有继承本类
    * 2.在对话框类的消息映射宏后面添加消映射链 CHAIN_MSG_MAP(CPaintColor)
    * 3.本类只是简单的演示,可在此基础上扩展
    */
    template <class T>    //T 为派生的对话框类
    class CPaintColor : public CMessageMap
    {
    public:
        CBrush        m_brushBkgnd;    //背景色,
        COLORREF    m_clrText;        //文字颜色
    public:
        CPaintColor(COLORREF clrText = RGB(0,0,255))
        {
            //默认颜色
            m_brushBkgnd.CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
            m_clrText = clrText;
        }
        ~CPaintColor()
        {
            if (m_brushBkgnd.m_hBrush != NULL)
                m_brushBkgnd.DeleteObject();
        }
    
        BEGIN_MSG_MAP(CPaintColor)
            MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)
            MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColorDlg)
            MESSAGE_HANDLER(WM_CTLCOLORDLG, OnCtlColorDlg)
            MESSAGE_HANDLER(WM_CTLCOLOREDIT, OnCtlColorDlg)
            MESSAGE_HANDLER(WM_CTLCOLORBTN, OnCtlColorDlg)
            MESSAGE_HANDLER(WM_CTLCOLORMSGBOX, OnCtlColorDlg)
            MESSAGE_HANDLER(WM_CTLCOLORLISTBOX, OnCtlColorDlg)
        END_MSG_MAP()
    
        //创建背景颜色画刷,也可以另外扩展以位图的方式
        HBRUSH CreateSolidBrush(COLORREF crColor)
        {
            if (m_brushBkgnd.m_hBrush != NULL)
                m_brushBkgnd.DeleteObject();
            m_brushBkgnd.CreateSolidBrush(crColor);
            return m_brushBkgnd.m_hBrush;
        }
        //设置文字颜色,并返回旧的颜色
        COLORREF SetTextColor(COLORREF clrText)
        {
            COLORREF clrTextOld = m_clrText;
            m_clrText = clrText;
            return clrTextOld;
        }
    
    protected:
        LRESULT OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)
        {
            T* pThis = static_cast<T*>(this);
            HDC hDc = (HDC)wParam;
            RECT rcRect;
            pThis->GetClientRect(&rcRect);
            FillRect(hDc,&rcRect,m_brushBkgnd);
            return 1;
        }
    
        LRESULT OnCtlColorDlg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
        {
            // TODO: 在此添加消息处理程序代码和/或调用默认值
            HDC hDc = (HDC)wParam;
            switch (uMsg)
            {
            case WM_CTLCOLORSTATIC:
            case WM_CTLCOLORBTN:
            case WM_CTLCOLORMSGBOX:
            case WM_CTLCOLORLISTBOX:
                {
                    ::SetBkMode(hDc,TRANSPARENT);
                    ::SetTextColor(hDc,m_clrText);
                    bHandled = TRUE;
                    return (LRESULT)m_brushBkgnd.m_hBrush;
                }
                break;
            case WM_CTLCOLORDLG:
            case WM_CTLCOLOREDIT:
            default:
                break;
            }
            return 0;
        }
    };

    好容易弄明白,留着以后使用

    转载于:https://www.cnblogs.com/guobbs/p/4301339.html

    展开全文
  • MFC 给对话框添加图片背景

    千次阅读 2018-10-16 14:53:48
    在windows开发当中做界面的主要技术之一就是使用MFC,通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现...为了实现美化对话框背景的效果,我们需要让我们的对话框响应WM_CTLCOLOR消息,每当我们的对话...
  • 对话框加上背景皮肤

    千次阅读 2005-09-21 09:29:00
    对话框的skin前段时间有些学生问我,怎么给我们做的对话框加上漂亮的skin,特别是就像qq游戏的登录以及游戏界面一样(qq游戏的登录界面就是一个对话框)。经过一些曲折,我在www.codeproject.com中找到了一些给...
  • 从上图可以看出,该对话框有一个圆角,以及标题,提示信息,两个按钮,按钮颜色是白色,按钮点击后背景会变成灰色,正常状态下对话框背景色是白色.并且除了点击取消按钮和返回键外,点击屏幕其他区域该对话框不会小时.那么...
  • 从上图能够看出,该对话框有一个圆角,以及标题,提示信息,两个button,button颜色是白色,button点击后背景会变成灰色,正常状态下对话框背景色是白色.而且除了点击取消button和返回键外,点击屏幕其它区域该对话框不会...
  • 页面弹出各种对话框的代码 页面弹出对话框,背景灰掉 页面弹出类似QQ对话框
  • 用MFC做漂亮界面之美化对话框

    万次阅读 多人点赞 2016-09-13 15:37:40
    在windows开发当中做界面的主要技术之一就是使用MFC,通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现。...为了实现美化对话框背景的效果,我们需要让我们的对话框响应WM_CTLCOLOR消息,每当我们的对话
  • 用TableView实现聊天对话框

    千次阅读 2013-09-17 22:15:53
    用tableView可实现如QQ,飞信,微信等聊天软件的对话框效果。 要实现如图功能要解决以下几个问题: 1.对话框的高度能随着文本的多少动态变化,如果字数少于一行能存放的最大字数还要调整对话框的宽度,如果对话框...
  • 自定义对话框<转>

    2015-07-21 17:50:00
    效果如下: <ignore_js_op> QQ截图20130221234404.png (51.02 KB, 下载次数: 126) ...对话框黑色背景问题 一般我们使用 [Java] 纯文本查看 复制代码 ? 1 new Al...
  • 安卓沉浸式全屏对话框的实现

    千次阅读 2019-08-31 22:20:52
    一、背景     在有些界面我们经常需要弹出全屏对话框,但是弹出的时候,因为对话框本身所带的padding,导致弹出的时,周围会有空隙。就算把空隙给补住,状态栏部分还是办透明黑色,如果自己的对话框是浅色风格的...
  • qq:9611153 微信lgs9611153 背景原因: 对话框是PC程序中相当重要的内容,功能不复杂的时候常用用到。 这是一段老旧的代码,拿出来打个卡。 古老而老生常谈的技术,过去的记忆,留在手里只会发霉,拿出来也许有...
  • Android 模仿IOS7风格的底部对话框,我个人比较喜欢ios7的一些弹窗风格,这里模仿一下ios7的对话框QQ安卓版也是做的和ios7一样的,弹出底部菜单列表和AlertDialog,本项目编码GBK默认编译版本4.2.2javaapk提供测试...
  • 背景 AS默认新建文件后会弹出一个「Add File to Git」的对话框,想让它不再提示,于是就点了一个「Remenber, dont’t ask again」,问题是后来手抖点到了「Cancel」,以后添加文件都不会加到暂存区了,需要手动Add,...
  • 看到qq等app上的那些popup很是让人渴望制作,但是呢,到底怎么才能得到那些对话框,以及怎么才能制作呢。我们没有美工,图片在网上有不太容易找到想要的(只有人家的实例图片),此时就想到一个讨巧的方法。下面就和...
  • by 鸟哥 qq1833183060 ;功能:演示 1、 image_button。2、设置模型空间的背景颜色 ;所需文件包括: image_button.lsp image_button.dcl ; ;加载步骤: ;1、加载lsp ;2、命令行输入 test (defun...
  • 1、登录QQ邮箱进入“写信”页面,点击主题输入框下面的文字链接“背景音乐”; 2、出现输入对话框后,点击搜索音乐,弹出搜索页面,输入要找的背景音乐名字; 3、点击"搜索mp3",出现搜索结果列表中,点击其中一首...
  • 全屏背景实现 截图功能实现(一)

    千次阅读 2013-05-30 13:09:02
     经过一天的时间,网上翻阅了一些资料,其实截图功能的原理相当简单一下子信心,就是创建一个全屏的对话框置顶显示(注意是当前窗口最顶)并且把当前桌面上的所有可见当作该对话框背景,如果实现了以上的功能表示...
  • 如下图,主要是从新浪博客贴过来的,先用记事本很麻烦。  1. 记事本转帖,麻烦,有公式的话需要单独处理,更麻烦  2....  3.粘到QQ对话框再占回来,完美。  4.如图处理方法,完美。 ...
  • QQ 登录界面布局

    千次阅读 2013-09-04 22:37:42
    我理解的QQ登录框是一个外层对话框QDialog里面包含两层QWidget: 背景层和响应层。 QQ登录框有三种背景:Flash动画、画卷•中国和背景图片(早期QQ)。 响应层包括四个界面:登录界面、添加QQ账号、多账户登录界面和...
  • Android仿手机QQ空间动态评论,自动定位到输入框

    万次阅读 热门讨论 2016-04-14 18:32:31
    可以使用对话框的形式,这样输入框不会影响原有的布局,弹出的对话框布局如下所示,点击EditText时,红色块的内容将位于输入法上面。在这里我把ScrollerView的背景设为透明。其实QQ空间的输入...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 208
精华内容 83
关键字:

qq对话框背景